Spring循环依赖

Spring循环依赖

一级缓存 singletonObjects  完整bean对象
二级缓存 earlySingletonObjects 早期不完整bean对象
三级缓存 singletonFactories  循环依赖早期代理对象(或普通对象)先放入三级缓存,获取bean时放入二级缓存,bean创建完成后放入一级缓存

个人理解,有错误请指正
在这里插入图片描述

如果只为解除循环依赖,可以在实例化后就把bean放入一级缓存,这样就可以解决循环依赖;
但是存在一个问题并发时可能从一级缓存获取到不完整的bean(属性还未注入);
这个问题可以通过加syncronized同步锁解决,但是这个锁粒度太大,获取已经创建好的bean也需要等待,所以加一个二级缓存存放不完整的bean,只锁二级缓存;
此时还有个问题就是如果需要创建代理类(代理类的生成是通过lambda表达式存储,获取时才创建),一个对象被多个对象依赖时就对创建多个对象,同时由于bean的生命周期规范,普通bean的代理对象创建是在bean实例化之后通过后置处理器解决。
综上,增加三级缓存,循环依赖的代理对象函数放入三级缓存(没有代理对象就是普通对象),获取该对象时执行lambda表达式生成代理对象放入二级缓存,这样代理对象就会只有一个,bean创建完成后放入一级缓存。普通对象生成代理对象还是在后置处理器执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值