Spring 中的循环依赖是怎么解决的

会产生循环依赖的场景:

一、通过构造方法进行依赖注入时产生的循环依赖问题。

二、通过setter方法进行依赖注入且是在多例(原型 prototype )模式下产生的循环依赖问题。

三、通过setter方法进行依赖注入且是在单例(singleton)模式下产生的循环依赖问题。

Spring所能解决的循环依赖是第三种,setter方式注入且是单例模式下

解决方案: 三级缓存 提前暴露待使用的实例

一级缓存:实例话完成的bean Cache of singleton objects: bean name to bean instance.

 private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);


二级缓存 早期暴露的bean  Cache of early singleton objects: bean name to bean instance. private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

//AOP时放的是代理类

三级缓存:单利bean工厂 Cache of singleton factories: bean name to ObjectFactory. private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);


case1: 返回为null 正常第一次初始化取值时为空 

case2: 非null 一级缓存非空 说明实例初始化完成,

              三级缓存非空 说明可能存在循环依赖  eg: a->b   b->a  在创建a调 addSingletonFactory() 放三级缓存之后,依赖属性赋值时populateBean()发现a 需要依赖b,然后getbean(b)发现b依赖a 然后走getbaen(a)的流程,会获取到三级缓存中内容让到二级缓存,返回a后继续创建b,然后把b放一级缓存,最后把a放一级缓存返回

image.png

 

原链接: https://www.processon.com/diagraming/61bc8d001efad406de49fc0f
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值