春季的循环依赖
Spring如何解决这个问题:豆A依赖于豆B,豆B依赖于豆A。
Spring 参考手册解释了如何解决循环依赖关系。首先将豆子实例化,然后相互注入。
请考虑以下类:
package mypackage;
public class A {
public A() {
System.out.println("Creating instance of A");
}
private B b;
public void setB(B b) {
System.out.println("Setting property b of A instance");
this.b = b;
}
}
和类似的类:B
package mypackage;
public class B {
public B() {
System.out.println("Creating instance of B");
}
private A a;
public void setA(A a) {
System.out.println("Setting property a of B instance");
this.a = a;
}
}
如果您随后有此配置文件:
<bean id="a" class="mypackage.A">
<property name="b" ref="b" />
</bean>
<bean id="b" class="mypackage.B">
<property name="a" ref="a" />
</bean>
使用此配置创建上下文时,您将看到以下输出:
Creating instance of A
Creating instance of B
Setting property a of B instance
Setting property b of A instance
请注意,当 注入 到 中时,尚未完全初始化。a
b
a
正如其他答案所说,Spring只是照顾它,创造豆子并根据需要注射它们。
其中一个后果是Bean注入/属性设置可能以与XML连接文件似乎暗示的顺序不同的顺序发生。因此,您需要小心,您的属性 setter 不会执行依赖于已调用的其他 setter 的初始化。处理此问题的方法是将 Bean 声明为实现接口。这需要您实现该方法,这是您执行关键初始化的地方。(我还会包含代码来检查是否实际设置了重要属性。InitializingBean
afterPropertiesSet()