什么是循环依赖?Spring是如何解决循环依赖这个问题的?

什么是循环依赖?

其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。

怎么产生的?

Spring的单例对象的初始化主要分为三步:

(1)createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象

(2)populateBean:填充属性,这一步主要是多bean的依赖属性进行填充

(3)initializeBean:调用spring xml中的init 方法。

从上面讲述的单例bean初始化步骤我们可以知道,循环依赖主要发生在第一、第二步。

也就是构造器循环依赖和field循环依赖。
 

Spring中循环依赖场景有

(1)构造器的循环依赖

(2)field属性的循环依赖。

怎么检测是否存在循环依赖

检测循环依赖相对比较容易,Bean在创建的时候可以给该Bean打标,如果递归调用回来发现正在创建中的话,即说明了循环依赖了。

Spring为了解决单例的循环依赖问题,使用了三级缓存

你可能感兴趣的:(Java高级)