Spring如何解决这个问题:bean A依赖于bean B,bean B依赖于bean A。
原文由 fastcodejava 发布,翻译遵循 CC BY-SA 4.0 许可协议
Spring如何解决这个问题:bean A依赖于bean B,bean B依赖于bean A。
原文由 fastcodejava 发布,翻译遵循 CC BY-SA 4.0 许可协议
Spring 参考手册 解释了循环依赖是如何解决的。 beans 首先被实例化,然后相互注入。
考虑这个类:
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
尚未完全初始化。
原文由 Richard Fearn 发布,翻译遵循 CC BY-SA 2.5 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
正如其他答案所说,Spring只是照顾它,创建bean并根据需要注入它们。
后果之一是 bean 注入/属性设置可能以与您的 XML 连接文件似乎暗示的顺序不同的顺序发生。因此,您需要注意您的属性设置器不会进行依赖于已调用的其他设置器的初始化。处理这个问题的方法是将 bean 声明为实现
InitializingBean
接口。这需要您实现afterPropertiesSet()
方法,这是您进行关键初始化的地方。 (我还将包含代码以检查是否实际设置了重要属性。)