Spring的循环依赖和三级缓存

转载

https://blog.csdn.net/bntX2jSQfEHy7/article/details/111658814

Spring有著名的三级缓存

  • singletonObjects:【一级缓存】 存储的是所有创建好了的单例Bean
  • earlySingletonObjects:【二级缓存】完成实例化,但是还未进行属性注入及初始化的对象
  • singletonFactories:【三级缓存】提前暴露的一个单例工厂,二级缓存中存储的就是从这个工厂中获取到的对象

一般而言,一个Spring对象创建分为三个部分

  • new一个对象
  • 为上面new出来的对象填充属性
  • 初始化,执行aware接口中的方法和相关初始化方法,并完成AOP代理

普通的循环依赖如图
在这里插入图片描述
从上面可以看到,三级缓存中存储的对象工厂其实没有任何实际作用。其中,我们是先创建了A对象,然后根据这个对象创建的工厂。完全可以支用二级缓存进行解决。

带AOP循环依赖图
在这里插入图片描述
和上面的区别是,A对象的的工厂返回的是A对象的代理。注意,并不是真正生成A的对象的代理,而是只会将三级缓存中加入这个工厂。
只有真正发生循环依赖的时候,才去利用这个工厂提前生成代理对象,

一个完成的spring bean的生命周期为
在这里插入图片描述
如果没有循环依赖,postProcessAfterInitialization后对bean添加AOP代理。现在有循环代理了,没有办法,只能提起你生成。

如果要使用二级缓存解决循环依赖,意味着所有Bean在实例化后就要完成AOP代理,这样违背了Spring设计的原则,Spring在设计之初就是通过AnnotationAwareAspectJAutoProxyCreator这个后置处理器来在Bean生命周期的最后一步来完成AOP代理,而不是在实例化后就立马进行AOP代理。

猜你喜欢

转载自blog.csdn.net/define_us/article/details/111768150
今日推荐