java如何在spring中处理循环依赖关系
例如,我有两个bean:
class Bean1 {
private SomeService service1;
private SomeService servive2;
private Bean2 bean2;
public void doStuff() {
service1.doActualStuff();
}
public void setBean2(Bean2 bean2) {
this.bean2 = bean2;
}
public Bean2 getBean2() { return this.bean2 }
}
class Bean2 {
private Bean1 bean1;
private SomeService3 service3;
public void init() {
bean1.doStuff();
}
public void setBean1(Bean1 bean1) {
this.bean1 = bean1;
}
}
现在,如果我尝试在spring中以以下方式配置它们:
<bean id="service1" class="SomeService">
...
</bean>
<bean id="bean1" class="Bean1">
<property name="bean2" ref="bean2"/>
<property name="service1" ref="service1"/>
...
</bean>
<bean id="bean2" class="Bean2" init-method="init">
<property name="bean1" ref="bean1"/>
...
</bean>
执行bean2的Init方法。Bean2已注入bean1,但bean1本身未完全初始化,因此调用bean1。将调用service1的doStuff()。doActualStuff()将返回NPE。为什么bean1没有完全初始化
# 1 楼答案
Spring将处于未完全初始化状态的单例bean缓存起来,以便注入到不可解析的循环引用中。在您的情况下,初始化顺序如下:
# 2 楼答案
如果您以编程方式注入第一个bean如何:
从spring xml中删除第一次注入: