1、静态代码块
static静态代码块,在类加载的时候即自动执行。
2、构造方法
在对象初始化时执行。执行顺序在static静态代码块之后。
3、通过注解@PostConstruct实现
@PostConstruct注解使用在方法上,它可以被用来标注一个非静态的 void 方法,这个方法会在该类被 Spring 容器初始化后立即执行。因为它的执行时机是在依赖注入之后,对象构造完成之后,也就是说是在@Autowired注入之后执行。所以这里可以进行一些初始化操作,如某些需要在对象创建后才能进行的数据初始化操作。
需要注意以下几点:
-
@PostConstruct 只能用在方法上面,而不能用在属性或构造函数上。
-
一个类中可以有多个使用 @PostConstruct 注解的方法,但执行顺序并不是固定的。
-
@PostConstruct 注解的方法在本类中必须是无参数的,如果有参数,那么这个方法不会被执行。
-
@PostConstruct 注解的方法在实现上可以使用任意修饰符。
假设我们有一个需要初始化数据的类:
public class InitService {
private List<String> data;
public InitService() {
this.data = Arrays.asList("A", "B", "C");
}
@PostConstruct
public void init() {
data.add("D");
}
public List<String> 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");
}
}
结论
最终的执行结果如下文章来源:https://www.toymoban.com/news/detail-489919.html
staticA
这是TestA 的构造方法
staticB
这是TestB的构造方法
这是TestB的init 方法
这是TestA的 init 方法
这是TestB的test方法
order1:TestApplicationRunner
order2:TestCommandLineRunner
所以得到结论:static>constructer> @Autowired>@PostConstruct>ApplicationRunner>CommandLineRunner文章来源地址https://www.toymoban.com/news/detail-489919.html
到了这里,关于SpringBoot启动时的几种初始化操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!