跳转至

二级缓存能否解决循环依赖

一、二级缓存方案

singletonObjects       // 一级
earlySingletonObjects  // 二级

创建 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。