2016年12月

本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

运行时期报错为:
The dependencies of some of the beans in the application context form a
异常为
BeanCurrentlyInCreationException

  • 什么是循环依赖?

当我们有两个(当然也可能是多个)类A、B,但是A依赖于B,但B也依赖与A,这就是循环依赖!
A->B->A...

  • 为什么会发生?

当程序启动,Spring Context加载所有的Bean时,会尝试按他们运行的工作顺序创建Bean,
没发生循环依赖的情况:
A->B->C
这里C依赖于B,B依赖于A,不会发生异常,程序正常编译。
循环依赖的发生于
你使用构造函数注入的时候,其他注入方式不会发生此问题,
因为其他方式会在程序用到这个依赖时,才会注入,而不是发生在Spring Context加载阶段。

  • 处理方法
  1. 重新设计你的程序:
    请不要质疑,你的程序设计发生了问题!,分层问题没有处理好,请重新设计它。
    当然,你还可以尝试以下常用的两种解决方案。

  2. 使用@Lazy注解:
    第一种方法是标记@Lazy注解到你的构造函数的参数内,让Spring懒惰的初始化
    这个Bean,即给这个Bean创建一个代理,当真正使用到这个Bean时才会完全创建。

     @Component
     public class CircularDependencyA {   private CircularDependencyB circB; 
          @Autowired
          public CircularDependencyA(@Lazy CircularDependencyB circB) {
              this.circB = circB;
          }
      }
  3. 使用Seter(Spring文档提出的)或者Field方式注入它:
    同样是依赖在使用到的时候才会创建这个依赖。
    Seter:

      @Component
      public class CircularDependencyA { 
         private CircularDependencyB circB;
    
          @Autowired
          public void setCircB(CircularDependencyB circB) {
              this.circB = circB;
          }
      }

    Field:

      @Component
      public class CircularDependencyA {
          @Autowired
          private CircularDependencyB circB;
     }

- 阅读剩余部分 -

Title - Artist
0:00