SpringBoot启动时的几种初始化操作 |
您所在的位置:网站首页 › with几种用法 › SpringBoot启动时的几种初始化操作 |
1、静态代码块
static静态代码块,在类加载的时候即自动执行。 2、构造方法在对象初始化时执行。执行顺序在static静态代码块之后。 3、通过注解@PostConstruct实现@PostConstruct注解使用在方法上,它可以被用来标注一个非静态的 void 方法,这个方法会在该类被 Spring 容器初始化后立即执行。因为它的执行时机是在依赖注入之后,对象构造完成之后,也就是说是在@Autowired注入之后执行。所以这里可以进行一些初始化操作,如某些需要在对象创建后才能进行的数据初始化操作。 需要注意以下几点: @PostConstruct 只能用在方法上面,而不能用在属性或构造函数上。 一个类中可以有多个使用 @PostConstruct 注解的方法,但执行顺序并不是固定的。 @PostConstruct 注解的方法在本类中必须是无参数的,如果有参数,那么这个方法不会被执行。 @PostConstruct 注解的方法在实现上可以使用任意修饰符。 假设我们有一个需要初始化数据的类: public class InitService { private List data; public InitService() { this.data = Arrays.asList("A", "B", "C"); } @PostConstruct public void init() { data.add("D"); } public List getData() { return this.data; } }当我们实例化 InitService 时,构造函数会为 data 属性赋初值,而 @PostConstruct 注解的 init 方法会在 Spring 容器实例化完 InitService 后被执行,将 “D” 添加到 data 列表中。所以当我们调用 getData() 方法时,返回的列表应该是 [A, B, C, D]。 接下来看看 @Autowired 和@PostConstruct 的具体执行顺序 @Service public class TestA { static { System.out.println("staticA"); } @Autowired private TestB testB; public TestA() { System.out.println("这是TestA 的构造方法"); } @PostConstruct private void init() { System.out.println("这是TestA的 init 方法"); testB.test(); } } @Service public class TestB { static { System.out.println("staticB"); } @PostConstruct private void init() { System.out.println("这是TestB的init 方法"); } public TestB() { System.out.println("这是TestB的构造方法"); } void test() { System.out.println("这是TestB的test方法"); } }服务启动后,输出结果如下: staticA 这是TestA 的构造方法 staticB 这是TestB的构造方法 这是TestB的init 方法 这是TestA的 init 方法 这是TestB的test方法 结论为:等@Autowired注入后,在执行@PostConstruct注解的方法。 4、实现CommandLineRunner和ApplicationRunner接口当有多个类实现了 ApplicationRunner 和 CommandLineRunner 接口时,可以通过在类上添加@Order注解来设定运行顺序。 实现ApplicationRunner接口 @Component @Order(1) public class TestApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("order1:TestApplicationRunner"); } }实现CommandLineRunner接口 @Component @Order(2) public class TestCommandLineRunner implements CommandLineRunner { @Override public void run(String... strings) throws Exception { System.out.println("order2:TestCommandLineRunner"); } } 结论最终的执行结果如下 staticA 这是TestA 的构造方法 staticB 这是TestB的构造方法 这是TestB的init 方法 这是TestA的 init 方法 这是TestB的test方法 order1:TestApplicationRunner order2:TestCommandLineRunner所以得到结论:static>constructer> @Autowired>@PostConstruct>CommandLineRunner>ApplicationRunner |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |