详解详解Spring 中如何控制中如何控制2个个bean中的初始化顺序中的初始化顺序
本篇文章主要介绍了Spring 中如何控制2个bean中的初始化顺序,具有一定的参考价值,感兴趣的小伙伴们可
以参考一下
开发过程中有这样一个场景,2个 bean 初始化逻辑中有依赖关系,需要控制二者的初始化顺序。实现方式可以有多种,本文
结合目前对 Spring 的理解,尝试列出几种思路。
场景场景
假设A,B两个 bean 都需要在初始化的时候从本地磁盘读取文件,其中B加载的文件,依赖A中加载的全局配置文件中配置的
路径,所以需要A先于B初始化,此外A中的配置改变后也需要触发B的重新加载逻辑,所以A,B需要注入彼此。
对于下面的模型,问题简化为:我们需要initA()先于initB()得到执行。
@Service
public class A {
@Autowired
private B b;
public A() {
System.out.println("A construct");
}
@PostConstruct
public void init() {
initA();
}
private void initA() {
System.out.println("A init");
}
}
@Service
public class B {
@Autowired
private A a;
public B() {
System.out.println("B construct");
}
@PostConstruct
public void init() {
initB();
}
private void initB(){
System.out.println("B init");
}
}
方案一:立方案一:立Flag
我们可以在业务层自己控制A,B的初始化顺序,在A中设置一个“是否初始化的”标记,B初始化前检测A是否得以初始化,如果
没有则调用A的初始化方法,所谓的check-and-act。对于上述模型,实现如下:
@Service
public class A {
private static volatile boolean initialized;
@Autowired
private B b;
public A() {
System.out.println("A construct");
}
@PostConstruct
public void init() {
initA();
}
public boolean isInitialized() {
评论10