Spring Bean的初始化是首先调用Bean的默认构造器,然后调用set方法对属性进行注入。
如果:
A包含属性B,B包含了属性A。
例子:
@Component
public class A {
@Autowired
private B b;
public void aHello(){
System.out.println("aHello!");
}
public void bothHello(){
aHello();
b.bHello();
}
}
@Component
public class B {
@Autowired
private A a;
public void bHello(){
System.out.println("bHello!");
}
}
public class HelloApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
A a = context.getBean(A.class);
a.bothHello();
}
}
输出:
aHello!
bHello!
A和B循环引用,程序正常运行。请问Spring是怎么解决类似的循环引用问题的?
先创建基本的Bean,再依赖注入(DI)。这样就没什么问题,解释得通。
比如顺序如下:
new出A的实例,
new出B的实例,
A Bean中的b字段赋值B的实例,
B bean中的a字段赋值A的实例。