大学生学习记录,如有错误,欢迎指出,感谢!
Spring 的 Bean 生命周期是固定且不可更改的:
实例化 → 属性填充 → 初始化方法 → 后置处理器生成 AOP 代理。
循环依赖发生在属性注入阶段,但代理对象正常是在初始化完成之后,通过后置处理器统一创建。
以 A、B 循环依赖举例:
B 在属性注入时需要提前拿到 A 的引用,但此时 A 只完成了实例化,还没走完初始化、也没到代理创建阶段。
如果不提前生成代理,B 只能注入 A 的原生裸对象;
但 A 后续走完生命周期,会被后置处理器生成代理对象存入容器。
最终就会出现:
容器中是代理 Bean,循环依赖注入的是原生 Bean,同一个单例 Bean 存在两份对象,违反单例规则。 所以只能借助三级缓存的 ObjectFactory,在依赖注入的当下提前判断、提前生成代理引用,
保证:循环依赖注入的对象、容器最终存放的对象,是同一个代理 Bean,从而兼顾循环依赖、AOP 代理、单例唯一性。
极简核心一句话
因为代理创建的时机,天生晚于属性注入;
循环依赖必须在注入阶段就拿到对象引用,没办法等走完初始化再创建代理,只能提前生成,否则原生对象和代理对象会共存,破坏单例。