当前位置:   article > 正文

spring为什么使用三级缓存而不是两级_spring为什么用三级缓存而不是二级缓存

spring为什么用三级缓存而不是二级缓存

首先先回答几个疑问:

1.实际上代理类是相当于持有一个原对象(spring用的两种代理,Proxy和cglib都是一样):先创建对象,再创建代理类,再初始化原对象,和初始化之后再创建代理类,是一样的。

基于上述类写个main方法测试:

先根据空对象创建代理类,再初始化空对象,执行代理类方法,没问题!(忽略get/set方法)

2.尾部对象依赖前面对象,所以在尾部对象初始化时,就调用三级缓存中对象工厂的接口方法,即AbstractAutowireCapableBeanFactory#getEarlyBeanReference方法根据前面的空对象创建代理类,并设值给尾部对象。

前面的对象在装配和初始化完成之后,spring通过这段代码,将二级缓存中的代理类取出返回,最后会设置到一级缓存中,从而保证尾部对象依赖的,和容器中的前面对象,是一个对象。


下面说下我的结论:只用两级缓存可以解决循环依赖,甚至一级缓存就行(AOP也同样适用)。

要理解下面的内容需要阅读过一定的spring源码,基础较弱的读者建议去看本回答的出处: 【超级干货】为什么spring一定要弄个三级缓存?。以免错过此次刷新你认知的机会(不是吹牛)。

不信你可以改下添加三级缓存的源码,直接加入第二层缓存或者第一层缓存里。

启动正常,所以验证了上述结论

为什么呢?很简单,解决循环依赖只需要保证创建完成的bean和创建中与设置到其他相互引用的bean里的bean是同一个就行。

没有代理的情况下(getEarlyBeanReference返回原对象)去创建AServiceImpl(简称AS):

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/938131
推荐阅读
相关标签
  

闽ICP备14008679号