三级缓存解决循环依赖

三级缓存解决循环依赖

首先说什么是循环依赖

A依赖b

B依赖a

A初始化时候发现需要b

B初始化发现需要a

这就是循环依赖

如何解决循环依赖

三级缓存解决

什么是三级缓存

第一层缓存放的是完整的初始化后的bean

第二层缓存放的是实例化后的bean

第三层放的是bean工厂 生产出来的实例化后的bean放在第二层。

正常工作流程是什么样的。

A初始化的时候发现需要b于是先将自己的实例化后的a放到二级缓存中。先去弄b

B初始化时候去第一层找a,没找到,去第二层找a,找到了,于是初始化成功,将自己放到第一层。删除其他层。

然后回到a的初始化,a初始化时候去找b,在第一层找到了,于是a初始化成功。

为什么需要这样的三层缓存,如果用一层或者两层或者三层能不能完成。

如果只有第一层的话,是无法解决这个循环依赖问题的,还是会互相找不到依赖的对象。

用这个理念至少是需要两层来解决。而且确实用两层是可以解决的。

那为什么需要第三层?

因为如果没有循环依赖的话我们可以先想一下aop也就是动态代理是发生在哪里的,是在实例化的后置方法中,是在实例化后才处理的。这是spring的统一设计思想。

那么如果我们按照这个思想来处理的话,在发生循环依赖时候,我给你b用的实例化的对象是我初始对象,但是后续我实例化好之后,我其实没有用a,我用的是a的代理对象,这就类似我面试是一个人,我上班是另一个人。是不合理的。所以发生循环依赖时候就要把这个操作提前,但提前的话我们又要想,不能对所有的都进行动态代理提前吧,是针对那些发生了循环依赖的才进行提前,如果没有循环依赖的情况,就还是放在后面。如果没有第三层缓存,就无法实现这个逻辑。简单说第三层换存就是为了解决循环依赖下的动态代理提前的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值