Java的循环依赖性
例如,以下有两个类别
对象A需要B对象,并且彼此需要a对象,彼此需要,因此称为圆形依赖关系
为了创建上面提到的周期依赖性,您可以做到这一点
核心想法是,首先制度化,然后设置依赖性
如上所示,这是运行的结果。为了更好地促进每个人理解该周期依赖性对象的创建过程,我画了一张图片
代码中的A中有b,而b为a,反映在堆中。实际上,在@491中有一个对b@492的引用,并且在b@492中也提到了@491
这样,我们创建了循环依赖的对象
如果无法先实例化周期依赖项的对象,然后设置,则该循环依赖性无法解决!
例如,A和B通过构造函数设置依赖项
实例化时,此循环依赖性需要依赖对象,并且依赖对象在实例化时需要自己,因此该周期依赖性未解决!
换句话说,并非所有周期依赖性都可以解决!
春季解决了对循环依赖性的相同思考。它与上述相同。相似,无法解决由构造函数引起的循环依赖性!
条件1:依赖注射方法!
在春季,有三种依赖注射的方法
有关春季依赖性的详细信息,请参阅春季依赖注入
上面还提到了基于构造方法的第一类依赖注入。如果产生了循环依赖性问题,则无法解决。如果生成其他两种类型的循环依赖性,则可以先通过第一实例化,然后可以求解依赖项来求解依赖关系。
条件第二:Bean的范围
有关Bean范围的详细信息,请参阅Spring Bean范围
在春季,Bean的范围将直接影响Bean的创造行为,而创建行为决定了它是否可以解决循环依赖性问题。在Bean的5个范围中,只有Singleton范围的创建。当发生周期依赖性时,弹簧框架可以自动帮助您解决,只要它符合条件一个
当一个周期依靠时,弹簧框架可以自动解决我们,但是有两个先决条件
由于只有当Singleton范围和BEAN的创建才能解决BEAN的循环依赖性时,我们才必须了解创建Bean的过程是更多的内容。我写了一篇单独的文章,并参考了Spring Singleton Beancycle的生活
我们A和B是两个类别,它们相互依赖
为了解决循环依赖性,有必要使用成员变量或方法来注入依赖关系。春季不建议使用基于成员变量的方法注入依赖项。可以自动组装,效果是相同的
现在,我们结合了Spring Singleton Bean的生命周期的过程,以列出春季如何解决这个周期依赖性
假设Spring会创建A,Singleton的范围,当创建Bean时,它将被调用,首先是从缓存中获得的。
以上是A和B没有由AOP代表。如果代表它们,它们实际上是相似的。唯一的区别是,获取Bean Factory的不是第三个缓存中的原始BEAN对象。代理对象相同。
作者:我的妻子Liyi的版权属于作者。