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