Spring如何解决循环依赖(精简版)

       

        上面两个bean在属性注入时都需要彼此,因此就造成了循环依赖的问题

       

        首先,bean的初始化完成需要经过三个过程:bean的实例化、属性注入、和最终的初始化完成,循环依赖就发生在属性注入的过程中

        我们都知道spring解决了循环依赖问题,那究竟是怎么解决的呢?

        实际上,spring是使用三级缓存解决了这个问题,而三个缓存本质上就是三个Map集合

 

         

        我们假设有A、B两个bean之间互相依赖

        首先,A实例化完成后会进行属性注入(A此时已存在于三级缓存bean对象工厂),在注入的过程中,A发现需要一个B对象注入,而此时,容器中发现并没有B,于是此时就会去实例化B

        实例化后的B对象进行属性注入的时候,发现需要一个A对象,此时它就会从一级缓存一直查询到三级缓存,发现三级缓存中存在一个实例化完成的A对象,于是将其放入二级缓存中同时将三级缓存中的删除,并完成B对象的属性注入,完成属性注入并初始化完成的B对象会放置在一级缓存当中

        此时,A对象继续进行属性注入,发现一级缓存中存在B对象,对使用其进行注入,并将初始化完成的A放入一级缓存中,删除二级缓存中的A对象,最后A、B两个对象都存在于一级缓存中,整个过程就结束了

        

        此外,估计大家也会疑惑为什么需要三级缓存,明明一个缓存存放实例化完成的bean,一个存放初始化完成的bean不就足够了吗,为什么还需要三个缓存呢?

        实际上,在bean创建过程中还有可能产生代理对象,因此,三个缓存刚好够存放

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值