Spring中的循环依赖

新手上路,请多包涵

Spring如何解决这个问题:bean A依赖于bean B,bean B依赖于bean A。

原文由 fastcodejava 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 678
2 个回答

正如其他答案所说,Spring只是照顾它,创建bean并根据需要注入它们。

后果之一是 bean 注入/属性设置可能以与您的 XML 连接文件似乎暗示的顺序不同的顺序发生。因此,您需要注意您的属性设置器不会进行依赖于已调用的其他设置器的初始化。处理这个问题的方法是将 bean 声明为实现 InitializingBean 接口。这需要您实现 afterPropertiesSet() 方法,这是您进行关键初始化的地方。 (我还将包含代码以检查是否实际设置了重要属性。)

原文由 Stephen C 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题