调用方法:
public static void main(String[] args) { Cycle cycle = new Cycle(); cycle.init(); System.out.println(((UserService) cycle.getBean("userService")).orderService); System.out.println(((OrderService) cycle.getBean("orderService")).userService); }运行结果:
com.codebear.cycles.OrderService@49e4cb85 com.codebear.cycles.UserService@2133c8f8 二级缓存能不能解决循环依赖,三级循环到底有什么用?我的观点可能和网上的主流观点有很大的出入,至于我的观点是对是错,请各位自行判断。
二级缓存可以解决循环依赖,哪怕aop bean循环依赖,上面我们已经提到了,我们可以创建完对象,直接创建代理对象,把代理对象放入二级缓存,这样我们从二级缓存获得的一定是aop bean,并非是bean本身。
三级缓存有什么用?网上的主流观点是为了解决循环依赖,还有就是为了效率,为了解决循环依赖,我们上面已经讨论过了,我的观点是二级缓存已经可以解决循环依赖了,下面就让我们想想,和效率是否有关系?
我的观点是没有关系,理由如下:
我们把【获得对象的工厂方法】放入了map
如果没有循环依赖,这个map根本没有用到,和效率没有关系;
如果是普通bean循环依赖,三级缓存直接返回了bean,和效率还是没有关系;
如果是aop bean循环依赖,如果没有三级缓存,直接创建代理对象,放入二级缓存,如果有三级缓存,还是需要创建代理对象,只是两者的时机不同,和效率还是没有关系。
有了这篇博客的基础,当你再看其他关于Spring循环依赖的博客,应该会轻松的多,因为我们毕竟自己解决了循环依赖,Spring的循环依赖只是在我们之上做了进一步的封装与改进。