你真的理解spring解决循环依赖要三级缓存,不是二级缓存吗?

8 阅读1分钟

大学生学习记录,如有错误,欢迎指出,感谢!

Spring 的 Bean 生命周期是固定且不可更改的:

实例化 → 属性填充 → 初始化方法 → 后置处理器生成 AOP 代理。

循环依赖发生在属性注入阶段,但代理对象正常是在初始化完成之后,通过后置处理器统一创建。

以 A、B 循环依赖举例:

B 在属性注入时需要提前拿到 A 的引用,但此时 A 只完成了实例化,还没走完初始化、也没到代理创建阶段。

如果不提前生成代理,B 只能注入 A 的原生裸对象;

但 A 后续走完生命周期,会被后置处理器生成代理对象存入容器。

最终就会出现:

容器中是代理 Bean,循环依赖注入的是原生 Bean,同一个单例 Bean 存在两份对象,违反单例规则。 所以只能借助三级缓存的 ObjectFactory,在依赖注入的当下提前判断、提前生成代理引用,

保证:循环依赖注入的对象、容器最终存放的对象,是同一个代理 Bean,从而兼顾循环依赖、AOP 代理、单例唯一性。

极简核心一句话

因为代理创建的时机,天生晚于属性注入;

循环依赖必须在注入阶段就拿到对象引用,没办法等走完初始化再创建代理,只能提前生成,否则原生对象和代理对象会共存,破坏单例。