正常情况下,二级缓存就可以解决循环依赖的问题,但是spring容器的aop特性导致
在bean实例化完成后的bean并不一定是最终容器中缓存的bean,因为最终一级缓存中的bean,
也就是经历了实例化、依赖注入、初始化之后的bean,可能在初始化阶段已经被aop增强了的代理取代了,
所以当出现循环依赖的时候,比如a依赖于b,b依赖于a,在a实例化完成之后,先将a包装在工厂类中(三级缓存)
,当b依赖注入时,一二级缓存中都不存在a的实例,所以去三级缓存中通过工厂方法获取a实例经过代理之后的引用,
这个引用与最终保存在一级缓存中的是同一个引用。这就是三级缓存的作用
至于为什么返回代理的处理不在二级缓存中做,是因为返回代理的操作只需要做一次,如果同时c也依赖于a,则c可以直接去
二级缓存中拿到这个代理对象
网友评论