怎么解决set注入造成的循环依赖

怎么解决set注入造成的循环依赖
靠三级缓存区解决的,A,B两个类,A中有B,B中有A,都是通过setter方法进行依赖注入的。先去实例化A的实例,根据A的beanDefinition定义 拿到A class的无参构造方法后,反射创建出来了A的实例对象,这时候A的实例对象,是一个尚未进行依赖注入和init-method方法调用等等逻辑处理的早期实例,他还不能让业务层直接拿来去用,可以理解为早产儿,在进行后续加工处理之前,会把这个早产儿包装到一个ObjectFactory对象内,然后存放到spring的第三级缓存中,key为beanName,value是这个ObjectFactory对象,这样的话,外部就可以通过这个三级缓存,拿到这个ObjectFactory对象,通过get方法,拿到刚刚创建的这个早期对象,然后spring会继续处理这个早期对象,进行依赖注入,使用getBean(B)的方式去获取a依赖的b,因为b尚未实例化,所以进入创建b的流程,创建b的早期对象后去处理b的依赖,发现b依赖a,会调用getbean(a),去获取a,可以从第三级缓存拿到a,然后完成b依赖a的处理,再调用b的int-method方法和执行一些bean后处理器的逻辑,b实例化完毕,存放到一级缓存中,再次返回处理到a对象的逻辑中,掉用a的int方法,然后把a放到一级缓存中。
三级缓存的数据,什么时候升级到二级缓存
getbean()的时候,如果获取到的实例是放在三级缓存中,那么会拿到它的ObjectFactory对象,调用get方法,拿到这个实例,返回这个早期实例之前,会进行一次缓存升级,把三级缓存的ObjectFactory干掉,放到二级缓存中
为什么要有三级缓存的存在
因为动态代理会产生新的calss类型,然后新的calss类型再实例化出来一个实例,它包装着原生对象,完成增强的,全新的对象,在堆上来看跟原来的对象也不是一个对象了,所以才必须有这个三级缓存的

一级缓存为单例池:singletonObjects
二级缓存为提前曝光对象:earlySingletonObjects
三级缓存为提前曝光对象工厂:singletonFactories

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值