Spring 如何解决循环依赖?

发布于

一、什么是循环依赖

A 依赖 B,B 依赖 A,形成循环。

二、三级缓存

Spring 通过三级缓存解决 singleton 的循环依赖:

  1. singletonObjects:一级缓存,存完全初始化好的 Bean。
  2. earlySingletonObjects:二级缓存,存早期引用(实例化但未属性赋值)。
  3. singletonFactories:三级缓存,存 Bean 的 ObjectFactory。

三、流程

  1. A 实例化后,把自己的工厂放入三级缓存。
  2. A 填充属性时发现依赖 B,去创建 B。
  3. B 实例化后发现依赖 A,从三级缓存获取 A 的早期引用(解决循环)。
  4. B 初始化完成,A 拿到 B 后继续初始化。

四、限制

  • 只解决 singleton 模式的 setter/字段注入循环依赖。
  • 构造器注入循环依赖无法解决(实例化都完成不了)。
  • prototype 作用域不解决。