Spring 如何解决循环依赖?
Spring 面试题发布于
一、什么是循环依赖
A 依赖 B,B 依赖 A,形成循环。
二、三级缓存
Spring 通过三级缓存解决 singleton 的循环依赖:
- singletonObjects:一级缓存,存完全初始化好的 Bean。
- earlySingletonObjects:二级缓存,存早期引用(实例化但未属性赋值)。
- singletonFactories:三级缓存,存 Bean 的 ObjectFactory。
三、流程
- A 实例化后,把自己的工厂放入三级缓存。
- A 填充属性时发现依赖 B,去创建 B。
- B 实例化后发现依赖 A,从三级缓存获取 A 的早期引用(解决循环)。
- B 初始化完成,A 拿到 B 后继续初始化。
四、限制
- 只解决 singleton 模式的 setter/字段注入循环依赖。
- 构造器注入循环依赖无法解决(实例化都完成不了)。
- prototype 作用域不解决。