spring循环依赖详细总结

spring循环依赖详细总结:
当前a,b两个bean相互依赖的时候就是循环依赖,spring处理循环依赖流程:
rerefsh -->finishBeanFactoryInitialization–>genBean–doGetBean–>createBean–>doCreateBean–>getSingleton–>createInstance–>addSingletonFactoics–>populateBean–>initiation
a对象创建的时候会先掉getBean(a)进行对象创建,调用createInstance创建对象,并把对象添加到三级缓存,这个时候添加的一个lamada表达式(key:a,value:lamaba),在对a对象里面的b属性进行赋值,赋值的时候先获取b属性,发现获取的b属性是一个RunTimeRefence对象,需要把这个对象转为beanDiefition对象,这个时候需要再次调用getBean(b)方法,传入b属性,由于b属性是一个对象,也需要创建bd对象,同流程一样,也需要把a对象添加对三级缓存,这个时候添加的一个lamada表达式(key:b,value:lamaba),这个需要给b对象里的a属性赋值,同样需要掉getBean(b)进行对象处理,这个时候就是奇迹发生的时候,应该创建前都会先查1,2,3级缓存,这个时候a,b(半成品)对象都存入了三级缓存,就是所谓的提前暴露。这个a从三级缓存中获取a的半成品对象,存入二级,同时删除三级缓存中的a,这个时候a返回,b对象就拿到了a返回的对象,完成自身实例化,然后b(成品对象)对象存入一级缓存,同时从三级缓存中删除,这个时候b对象完成同时就返回,这个时候a对象就拿到了b对象返回的对象,完成自身实例化,然后a(成品)对象存入一级缓存,同时从二级缓存中删除。这个时候循环还没有结束,因为我们只是获取了a对象进行操作的,因为list中有2个对象,还有一个b这个时候开始遍历b,因为在a对象创建完成的时候b对象提前创建好了,这个b对象直接从一级缓存中获取返回即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值