存在循环 bean 依赖时 Spring Bean 创建的随机性

Ash*_*ena 3 java spring circular-reference

我们的应用程序广泛使用Spring Beans,我们随机看到应用程序启动错误说有循环Bean依赖。但是这个错误并不总是发生,而是在多次重启中随机发生。这里随机性的原因是什么?如果存在循环依赖,为什么它不会始终失败/成功?

异常:org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名为“x”的 bean 时出错:请求的 bean 当前正在创建中:是否存在无法解析的循环引用?

Ash*_*ena 5

Spring开始初始化bean的过程,并在这个过程中了解循环引用。根据使用的是基于构造函数还是基于成员的自动连接,循环引用可能会成功,也可能不会成功。如果循环依赖链中涉及的两个类使用构造函数自动装配或成员自动装配,则可能发生以下情况:

  1. 构造函数自动装配 + 构造函数自动装配 = Bean 初始化将始终失败
  2. 构造函数自动装配 + 成员自动装配 = 失败取决于初始化顺序(可能是随机的)如果首先初始化具有构造函数自动装配的 Bean,则 bean 初始化将失败。湾 如果首先初始化具有成员自动装配的 Bean,则 bean 初始化将成功。
  3. 成员自动装配 + 成员自动装配 = 即使使用循环依赖,Bean 初始化也将始终成功

因此,如果您有循环依赖关系并且自动装配属于类别 (2),您可能会随机观察到成功/失败的循环依赖解析。