[Spring] 深度解析系列 (5) 番外- 循环依赖

2019-12-18  本文已影响0人  起个名忒难

在Spring的面试中,经常会被问到的一个问题,就是Spring是如何解决循环依赖的。
之前也有说过Spring解决循环依赖也只是在单例中,prototype 是无法解决的。

循环依赖指的是循环引用,就是两个或多个bean相互之间持有对方,比如 A -> B ,B-> C ,C -> A 。 最终形成一个环。

关于Spring bean的创建 ,其本质上还有一个对象的创建,既然是对象,那么就应该分成两个部分,一个是对象的实力,一个是对象属性的实例化或者称为注入。

通过前面的分析,其实已经发现,对象的实例化是通过反射实现的。获取到了Class对象之后,进而通过newInstance()方法实现。而对象属性的实例化则是通过PropertyDescriptor 实现的 。

现在定义循环引用类。

public class A {
    
    private B b ;

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }
}
public class B {
    private C c ;

    public C getC() {
        return c;
    }

    public void setC(C c) {
        this.c = c;
    }
}
public class C {
    private A a ;

    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }
}
image.png

类之间相互引用最终形成了一个闭环。

Spring 将循环依赖的处理分成了三种情况:

上一篇下一篇

猜你喜欢

热点阅读