二级缓存能否解决循环依赖¶
一、二级缓存方案¶
创建 A 时,实例化后直接放二级缓存。B 需要 A 时从二级拿。
二、能解决普通循环依赖¶
A、B 互相依赖,没有 AOP: - 实例化 A → 放二级。 - B 拿 A → 完成。 - A 拿 B → 完成。
二级缓存够。
三、有 AOP 就不行¶
A 被 AOP 代理,B 应该拿到代理对象。
二级缓存的问题¶
二级缓存存的是原始 A。B 拿到的是原始 A,不是代理 A。
解决方案¶
实例化后就生成代理,放二级缓存。
但这样: - 所有 Bean 都提前生成代理。 - 即使没有循环依赖,也提前生成。 - 破坏了 Bean 生命周期(AOP 应该在 postProcessAfterInitialization 生成)。
四、三级缓存的优势¶
三级缓存存 ObjectFactory: - 第一次访问时才决定要不要生成代理。 - 有循环依赖:提前生成。 - 无循环依赖:正常在后置处理生成。
五、结论¶
| 二级缓存 | 三级缓存 | |
|---|---|---|
| 普通循环依赖 | ✅ | ✅ |
| AOP 循环依赖 | 要提前生成代理 | 延迟生成 |
| 生命周期 | 破坏 | 保持 |
一句话
二级缓存能解决普通循环依赖,但有 AOP 就不行。三级缓存是为了兼容 AOP。