外观
一句话答案
Spring 三级缓存解决 setter 注入循环依赖:一级(成品 Bean)、二级(半成品)、三级(ObjectFactory,解决 AOP 代理)。
核心要点
三级缓存:
- singletonObjects(一级):完整初始化的Bean
- earlySingletonObjects(二级):提前曝光的半成品Bean
- singletonFactories(三级):Bean的ObjectFactory(解决AOP代理)
流程: A创建→放三级缓存→注入B→B创建→注入A(从三级升到二级)→B完成→A完成
不能解决: 构造器注入的循环依赖
追问与易错
追问方向:
- 为什么需要三级缓存?两级不行吗?(二级无法处理 AOP 代理的情况)
- 构造器注入的循环依赖能解决吗?(不能,因为对象还没创建无法放入缓存)
- @Lazy 怎么解决循环依赖的?(注入代理对象,延迟到实际调用时才初始化)
易错点:
- ❌ "三级缓存是为了解决循环依赖"——更准确说是为了解决「有 AOP 代理的循环依赖」
- ❌ "所有循环依赖都能解决"——构造器注入和 prototype 作用域的循环依赖无法解决
💡 记忆锚点
三级缓存 = 三层货架:一级放成品(完整Bean)、二级放半成品(已实例化未注入属性)、三级放工厂(ObjectFactory,需要AOP时生产代理对象)。A和B互相依赖时,A先放三级货架的工厂,B来拿到A的半成品引用完成自己,A再完成自己。构造器注入解决不了——对象还没造出来没法上架。