Spring三级缓存
为什么Spring必须是三级缓存,而不是二级或者一级。
想象一个“盖房子”的场景。
- Bean = 一栋需要装修的房子。
- 依赖注入 = 给房子安装定制家具。
- AOP 代理 = 给房子加装一个“智能安防系统”(这个系统会包裹整个房子,改变房子的某些进出行为)。
假设有两栋房子 A 和 B,它们的设计图纸很奇怪:
- 房子 A 需要一个从房子 B 定制的书桌 (
@Autowired B b
)。 - 房子 B 需要一个从房子 A 定制的椅子 (
@Autowired A a
)。
这就是循环依赖。
场景一:如果只有一级缓存 (singletonObjects
成品房仓库)
- 开工盖 A: 工人开始盖房子 A 的毛坯。
- 需要 B 的书桌: 工人发现 A 需要 B 的书桌,于是停下 A 的工程,跑去盖房子 B。
- 开工盖 B: 工人开始盖 B 的毛坯。
- 需要 A 的椅子: 工人发现 B 需要 A 的椅子,于是又停下 B 的工程,跑回去找 A。
- 死循环: 此时 A 的工程也停着,因为它在等 B。B 的工程也停着,因为它在等 A。两边的工人都大眼瞪小眼,工程永远无法完成。
结论: 一级缓存绝对不行,会直接卡死。