春季的循环依赖

2022-08-31 08:47:31

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


答案 1

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

请注意,当 注入 到 中时,尚未完全初始化。aba


答案 2

正如其他答案所说,Spring只是照顾它,创造豆子并根据需要注射它们。

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


推荐