三级缓存解决循环依赖
首先说什么是循环依赖
A依赖b
B依赖a
A初始化时候发现需要b
B初始化发现需要a
这就是循环依赖
如何解决循环依赖
三级缓存解决
什么是三级缓存
第一层缓存放的是完整的初始化后的bean
第二层缓存放的是实例化后的bean
第三层放的是bean工厂 生产出来的实例化后的bean放在第二层。
正常工作流程是什么样的。
A初始化的时候发现需要b于是先将自己的实例化后的a放到二级缓存中。先去弄b
B初始化时候去第一层找a,没找到,去第二层找a,找到了,于是初始化成功,将自己放到第一层。删除其他层。
然后回到a的初始化,a初始化时候去找b,在第一层找到了,于是a初始化成功。
为什么需要这样的三层缓存,如果用一层或者两层或者三层能不能完成。
如果只有第一层的话,是无法解决这个循环依赖问题的,还是会互相找不到依赖的对象。
用这个理念至少是需要两层来解决。而且确实用两层是可以解决的。
那为什么需要第三层?
因为如果没有循环依赖的话我们可以先想一下aop也就是动态代理是发生在哪里的,是在实例化的后置方法中,是在实例化后才处理的。这是spring的统一设计思想。
那么如果我们按照这个思想来处理的话,在发生循环依赖时候,我给你b用的实例化的对象是我初始对象,但是后续我实例化好之后,我其实没有用a,我用的是a的代理对象,这就类似我面试是一个人,我上班是另一个人。是不合理的。所以发生循环依赖时候就要把这个操作提前,但提前的话我们又要想,不能对所有的都进行动态代理提前吧,是针对那些发生了循环依赖的才进行提前,如果没有循环依赖的情况,就还是放在后面。如果没有第三层缓存,就无法实现这个逻辑。简单说第三层换存就是为了解决循环依赖下的动态代理提前的问题。