正常情况下,二级缓存就可以解决循环依赖的问题,但是spring容器的aop特性导致
在bean实例化完成后的bean并不一定是最终容器中缓存的bean,因为最终一级缓存中的bean,
也就是经历了实例化、依赖注入、初始化之后的bean,可能在初始化阶段已经被aop增强了的代理取代了,
所以当出现循环依赖的时候,比如a依赖于b,b依赖于a,在a实例化完成之后,先将a包装在工厂类中(三级缓存)
,当b依赖注入时,一二级缓存中都不存在a的实例,所以去三级缓存中通过工厂方法获取a实例经过代理之后的引用,
这个引用与最终保存在一级缓存中的是同一个引用。这就是三级缓存的作用
至于为什么返回代理的处理不在二级缓存中做,是因为返回代理的操作只需要做一次,如果同时c也依赖于a,则c可以直接去
二级缓存中拿到这个代理对象
spring 三级缓存解决循环依赖的理解
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1,什么是 Spring 的循环依赖 简单来讲,就是有一个 A 对象,创建 A 的时候发现 A 对象依赖 B,然后...
- 前言 如果在日常开发中我们用new对象的方式,若多个构造函数相互依赖的话,程序会在运行时一直循环调用最终导致内存溢...
- 参考文章:Spring 为何需要三级缓存解决循环依赖,而不是二级缓存 Spring是如何利用"三级缓存"巧妙解决B...