Spring 如何用三级缓存解决循环依赖¶
一、三级缓存¶
singletonObjects // 一级:完整 Bean
earlySingletonObjects // 二级:早期 Bean
singletonFactories // 三级:ObjectFactory
二、流程¶
创建 A¶
- 实例化 A。
- 把 A 的 ObjectFactory 放三级缓存。
- 属性填充,需要 B。
创建 B¶
- 实例化 B。
- 把 B 的 ObjectFactory 放三级缓存。
- 属性填充,需要 A。
- 从三级缓存拿 A 的 ObjectFactory,调用 getObject()。
- getObject() 判断:A 需要代理吗?
- 不需要:返回原始 A。
- 需要:生成代理 A。
- 把结果放二级缓存,从三级删除。
- B 拿到 A,完成。
回到 A¶
- A 拿到 B,完成。
- 把 A 放一级缓存。
三、为什么三级¶
二级缓存不够¶
二级缓存直接存 A 的原始对象。如果 A 被 AOP 代理,B 应该拿到代理对象,不是原始 A。
三级缓存的 ObjectFactory 决定: - 第一次访问时才生成代理。 - 不提前生成。
四、为什么需要三级而不是二级¶
如果 A 没有循环依赖,AOP 应该在 postProcessAfterInitialization 才生成代理。三级缓存保证: - 有循环依赖:提前生成代理。 - 无循环依赖:正常在后置处理生成。
一句话
三级缓存 = 延迟生成代理,有循环依赖才提前暴露。