赞
踩
首先先回答几个疑问:
1.实际上代理类是相当于持有一个原对象(spring用的两种代理,Proxy和cglib都是一样):先创建对象,再创建代理类,再初始化原对象,和初始化之后再创建代理类,是一样的。
基于上述类写个main方法测试:
先根据空对象创建代理类,再初始化空对象,执行代理类方法,没问题!(忽略get/set方法)
2.尾部对象依赖前面对象,所以在尾部对象初始化时,就调用三级缓存中对象工厂的接口方法,即AbstractAutowireCapableBeanFactory#getEarlyBeanReference方法根据前面的空对象创建代理类,并设值给尾部对象。
前面的对象在装配和初始化完成之后,spring通过这段代码,将二级缓存中的代理类取出返回,最后会设置到一级缓存中,从而保证尾部对象依赖的,和容器中的前面对象,是一个对象。
下面说下我的结论:只用两级缓存可以解决循环依赖,甚至一级缓存就行(AOP也同样适用)。
要理解下面的内容需要阅读过一定的spring源码,基础较弱的读者建议去看本回答的出处: 【超级干货】为什么spring一定要弄个三级缓存?。以免错过此次刷新你认知的机会(不是吹牛)。
不信你可以改下添加三级缓存的源码,直接加入第二层缓存或者第一层缓存里。
启动正常,所以验证了上述结论
为什么呢?很简单,解决循环依赖只需要保证创建完成的bean和创建中与设置到其他相互引用的bean里的bean是同一个就行。
没有代理的情况下(getEarlyBeanReference返回原对象)去创建AServiceImpl(简称AS):
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。