关于Spring解决循环依赖的一些理解

此文仅以文字形式记录自己的一些理解
Spring是采用了三级缓存的方式来解决循环依赖的问题的,
一级缓存:存储的是已经初始化完成的实例对象
二级缓存:实例化了但是还没有属性注入的对象
三级缓存:生成bean的工厂生成的一个bean
二级和三级缓存有什么区别呢?
其实若是单纯的想要解决循环依赖的问题,我们只需要二级缓存就可以解决了,具体流程如下:比如说A和B相互依赖,我们先对A初始化,在实例化之后,将A放入到三级缓存中,注入属性时发现没有B,那么去对B初始化,b实例化后注入属性去找A,在三级缓存中找到A,完成属性注入(但此时的A还不完整),此时将A放入到二级缓存中,在三级缓存中删除A(目前来看是很多余的),此时在返回去完成A的属性注入(B中A也变成完整的了),我们发现这个过程是可以使用两级缓存来解决的。
那么Spring为什么还要设置三级缓存来解决这个问题呢,这就涉及到了AOP的这一设计了,假如上述过程中A是被代理的对象,那么我们在三级缓存中获取A的实例时其实是返回了一个代理对象,而且这个代理对象不是单例的,所以说我们每次去三级缓存获取A的实例时都会得到一个不一样的代理对象,这显然时不行的,加入A中同时和B,C都有循环依赖那么可能出限B,C中注入的A时不一样的,就会出现问题,所以就引入了一个二级缓存,当 第一次去三级缓存中获取A的代理对象的时候,就将这个代理对象放入到二级缓存了(并且在三级缓存删除A),这样以后再次来取的话就不是重新创建一个了,而是将这个返回,就解决了代理对象不同的问题。
仅仅时自己的一些理解,希望大家指正

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值