Spring使用三级缓存解决循环依赖

创建单例bean的三个主要步骤:1. 实例化。2. 填充属性。3. 初始化。
第一级缓存:singletonObjects,存放经过初始化后的bean。当通过名字获取bean的时候,如果这个名字对应的bean在第一级缓存中,则直接从第一级缓存中获取返回,这样就不会导致多次创建bean了。
第二级缓存:earlySingletonObjects,存放不完整的bean,对象就是最终的对象,但是对象的属性可能不完整。当填充依赖对象的时候,先从一级二级缓存中查找,如果找到了,则直接拿出来赋值。如果没找到,则使用三级缓存创建,然后放入到二级缓存中。
场景:A依赖B和C,B依赖A,C依赖A。A填充B的时候要构造B,然后填充B的时候需要A,所以B就从一级二级缓存中查找A,没找到,就使用三级缓存创建最终的A填充到B的A属性。A填充C的时候要构造C,然后填充C的时候需要A,所以C就从一级二级缓存中查找A,找到了,直接填充。
第三级缓存:singletonFactories,存放bean对应的工厂对象,主要得到根据原始对象进行AOP之后的代理对象。在bean实例化之后就将生成最终对象的ObjectFactory对象放入到三级缓存中,当从二级缓存中获取不到对象的时候,就根据这个ObjectFactory生成最终对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值