通俗解释spring是如何解决循环依赖的

spring解决的是bean属性的循环依赖,bean的初始化一般要经过实例化、属性赋值、初始化三个过程之后才能被spring使用的。循环依赖其实是发生在属性赋值的阶段。

spring是通过三级缓存去解决循环依赖的问题的,三级缓存其实就是其实就是spring在初始化bean的过程中三个不同的存放不同时期的bean的三个map。分别存放完整的bean、提前曝光的半成品bean、和半成品bean
它们分别是singletonObjects,earlySingletonObjects,以及singletonFactories这三个map。其中singletonObjects是用来保存创建好的成品对象,earlySingletonObjects是用来保存提前曝光出来的对象,singletonFactories是用来保存获取半成品对象的ObjectFactory的。

有两个类A和B,A中有类型为B的成员属性,B中又有类型为A的成员属性,注意不能是prototype,也不能是构造器依赖。当创建了一个不完整的A对象时候(其实也就是只调用了A的构造方法而没有进行属性填充),这时候会把这个“不完整”的A对象包装成ObjectFactory后放到singletonFactories中,再去做属性填充的动作,然后就在属性填充的时候发现了需要初始化B,就跑去初始化B去了,然后也是先创建了一个不完整的B并且包装成ObjectFactory放到了singletonFactories后去填充属性,这时候发现需要一个A,然后又去初始化A,但是此时singletonFactories里面的话已经有个不完整的A的ObjectFactory了,这时候就可以通过这个singletonFactories来获取到半成品的A的ObjectFactory,再通过A的ObjectFactory获取到半成品A,注意这里还会把这个半成品A的ObjectFactory从singletonFactories移除,然后还会把半成品A放到earlySingletonObjects中去**,拿到半成品A后去填充B,B创建完了之后再用创建完的B填充A,这样A和B的创建过程就完成了。
创建bean的过程依次执行doGetBean、查询缓存、createBean创建实例,实例化生成半成品ObjectFactory放入三级缓存singletonFactories中,接着执行populateBean方法装配属性
解决循环依赖的流程图如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值