详解三级缓存解决循环依赖

循环依赖

所谓的循环依赖就是

A对象创建的时候需要通过@Autowired依赖注入B对象才能创建成功,B对象创建的时候需要@Autowired依赖注入A对象才可以创建成功,这种情况之下,我们称之为循环依赖,循环依赖主要发生在Bean的set赋值这个过程

其实@Autowired就已经解决了循环依赖的问题

缓存

三级缓存解决循环依赖

我们以A对象为例,A对象通过BeanFunctionRead读取配置文件,利用反射机制进行实例化创建之后,因为此时没有赋值初始化等,还不是一个完整的bean所以无法放进一级缓存,先放入三级缓存之中,

然后调用Autowired注解进行属性的赋值,发现B对象还没有创建出来,先暂停,准备创建B对象

B对象利用反射机制实例化之后也放进三级缓存当中,然后进行Autowired注解进行属性赋值,

发现需要A注解,那么从一、二、三 级缓存当中依次去寻找,发现三级缓存当中存在A注解,那么就调用ObjectFactory中的getObject方法进行调用,然后B把A放进二级缓存中,B进行赋值

然后执行其他阶段,直至把B创建出来放进一级缓存当中,之后清空二三缓存

B创建成功之后,A可以获取B就可以继续进行创建,然后A开始进行Autowired注解进行赋值,然后继续执行其他阶段,然后A对象创建成功,放进一级缓存当中,同时清空二三缓存

首先A对象实例化之后,将A对象的ObjectFactory放进三级缓存当中,对A对象进行属性注入B对象(一二三级缓存当中都没有),就暂停创建,创建这个B对象,这个B对象也先开始实例化,实例话之后也将A对象放进三级缓存当中,B对象开始进行注入,发现三级缓存中有A的ObjectFactory对象,就使用getObject方法获取A对象进行赋值,赋值完成之后会把这个B对象放进二级缓存当中,进行初始化等后续操作,等到B对象创建完成存放到一级缓存中,然后清空二三级缓存,之后A对象继续创建,从一级缓存给中拿到B的完成对象,创建成功之后将A对象放进一级缓存当中,然后再清空二三级缓存

实例化之后放进三级缓存当中,赋值之后放进二级缓存当中,创建完成之后放进以一级缓存当中,但是在源码当中,如果放进二级缓存之后就把三级缓存清空,放进一级缓存之后清空二级缓存

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值