什么是循环依赖?
循环依赖值得是bean 与bean 之间相互依赖的关系
spring是如何处理构造器注入循环依赖的?
首先Spring会走Bean的实例化流程尝试创建 A 的实例 ,在创建实例之间先从 “正在创建Bean池” (一个缓存Map而已)中去查找A 是否正在创建,如果没找到,则将 A 放入 “正在创建Bean池”中,然后准备实例化构造器参数 B。
Spring会走Bean的实例化流程尝试创建 B 的实例 ,在创建实例之间先从 “正在创建Bean池” (一个缓存Map而已)中去查找B 是否正在创建,如果没找到,则将 B 放入 “正在创建Bean池”中,然后准备实例化构造器参数 A。
Spring会走Bean的实例化流程尝试创建 A 的实例 ,在创建实例之间先从 “正在创建Bean池” (一个缓存Map而已)中去查找A 是否正在创建。
此时:Spring发现 A 正处于“正在创建Bean池”,表示出现构造器循环依赖,抛出异常:“BeanCurrentlyInCreationException”
spring如何处理setter 注入循环依赖的?
Spring创建BeanA,通过无参构造实例化,并暴露一个ObjectFactory,用来获取创建中的BeanA,然后把BeanA添加到“正在创建Bean池”中,然后通过setter注入BeanB
Spring创建BeanB,通过无参构造实例化,并暴露一个ObjectFactory,用来获取创建中的BeanB,然后把BeanB添加到“正在创建Bean池”中,然后通过setter注入BeanA
在BeanB通过setter注入BeanA时,由于BeanA 提前暴露了ObjectFactory ,通过它返回一个提前暴露一个创建中的BeanA。
然后完成BeanB的依赖注入
总结 1.spring只支持setter 注入的循环依赖。spring 通过提前暴露未完成实例化的bean的objectFactory 工厂来实现循环依赖的,这样做的目的是其他的bean 可以通过ObjectFactory 引用到该bean,在获取依赖的bean 的时候使用到了三级缓存。