我对Spring中的 Autowiring 顺序和@PostConstruct
逻辑有疑问。例如下面的演示代码,我有一个主要的Spring Boot类:
@SpringBootApplication
public class Demo1Application {
@Autowired
BeanB beanb;
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}
和2个
@Service
定义:@Service
public class BeanB {
@Autowired
private BeanA beana ;
@PostConstruct
public void init(){
System.out.println("beanb is called");
}
public void printMe(){
System.out.println("print me is called in Bean B");
}
}
@Service
public class BeanA {
@Autowired
private BeanB b;
@PostConstruct
public void init(){
System.out.println("bean a is called");
b.printMe();
}
}
我有以下输出:
我的问题是,自动布线是如何像上述方案一样逐步进行的?
以及如何在不先调用
printMe()
的情况下调用beanb
的@PostConstruct
方法? 最佳答案
下面应该是可能的顺序
beanb
开始自动连接Beanb
的类初始化期间,beana开始获取自动连接的@PostConstruct
,即beana的init()
被称为init()
内部,System.out.println("bean a is called");
被称为b.printMe();
导致System.out.println("print me is called in Bean B");
执行beana
完成后的@PostConstruct
,即init()
的beanb
称为System.out.println("beanb is called");
被称为理想情况下,调试器可以在Eclipse中更好地观察到相同的结果。
Spring reference manual解释了如何解决循环依赖性。首先实例化bean,然后将它们相互注入(inject)。