Spring中的循环依赖关系通过setter注入

时间:2016-10-06 20:21:06

标签: spring

请考虑以下代码:
这是A级

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级

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尚未完全初始化。

我的问题:
即使&#39; a&#39;当&#39; b&#39;没有完全初始化参考&#39; a&#39; ,但过了一会儿&#39; a&#39;将完全初始化。因为&#39; b&#39;提及&#39; a&#39;然后&#39; b&#39;将指向完全初始化的&#39; a&#39;过了一会儿。 通常给出该解释以显示循环依赖性的缺点。 但最终我们有一个正常的情况,两个完全初始化的豆类&#39; a&#39;和&#39; b&#39;互相指向。因此,这个例子如何向我们展示使用循环依赖的缺点?

我引用春季文档:

  

与典型案例(没有循环依赖关系)不同,是一个循环   bean A和bean B之间的依赖关系强制其中一个bean   在完全初始化之前注入另一个(a   经典的鸡肉/鸡蛋情景)

参考:取自Circular dependency in spring

的示例

1 个答案:

答案 0 :(得分:0)

Spring文档解释了dependency resolution process

  

典型案例(没有循环依赖关系)不同,一个循环   bean A和bean B之间的依赖关系强制其中一个bean   注入其他之前的,以完全初始化自己(a   经典鸡/蛋情景)。

bean首先实例化,然后互相注入。

这就是为什么Spring 需要一个没有参数的构造函数 ;-)