跳转至

Spring 如何用三级缓存解决循环依赖

一、三级缓存

singletonObjects       // 一级:完整 Bean
earlySingletonObjects  // 二级:早期 Bean
singletonFactories     // 三级:ObjectFactory

二、流程

创建 A

  1. 实例化 A。
  2. 把 A 的 ObjectFactory 放三级缓存。
  3. 属性填充,需要 B。

创建 B

  1. 实例化 B。
  2. 把 B 的 ObjectFactory 放三级缓存。
  3. 属性填充,需要 A。
  4. 从三级缓存拿 A 的 ObjectFactory,调用 getObject()。
  5. getObject() 判断:A 需要代理吗?
  6. 不需要:返回原始 A。
  7. 需要:生成代理 A。
  8. 把结果放二级缓存,从三级删除。
  9. B 拿到 A,完成。

回到 A

  1. A 拿到 B,完成。
  2. 把 A 放一级缓存。

三、为什么三级

二级缓存不够

二级缓存直接存 A 的原始对象。如果 A 被 AOP 代理,B 应该拿到代理对象,不是原始 A。

三级缓存的 ObjectFactory 决定: - 第一次访问时才生成代理。 - 不提前生成。

四、为什么需要三级而不是二级

如果 A 没有循环依赖,AOP 应该在 postProcessAfterInitialization 才生成代理。三级缓存保证: - 有循环依赖:提前生成代理。 - 无循环依赖:正常在后置处理生成。

一句话

三级缓存 = 延迟生成代理,有循环依赖才提前暴露。