BeanCurrentlyInCreationException解决当前容器创建异常、循环依赖问题
一、什么是循环依赖呢?
类A依赖类B,类B也依赖类A,这种情况就会出现循环依赖。
Bean A → Bean B → Bean A
上面是比较容易发现的循环依赖,也有更深层次的循环依赖。
Bean A → Bean B → Bean C → Bean D → Bean E → Bean A
二、Spring 的循环依赖
当Spring上下文在加载所有的bean时,会尝试按照他们他们关联关系的顺序进行创建。如果不存在循环依赖时,例如:
Bean A → Bean B → Bean C
Spring会先创建Bean C,再创建Bean B(并将Bean C注入到Bean B中),最后再创建Bean A(并将Bean B注入到Bean A中)。
但是,如果我们存在循环依赖,Spring上下文不知道应该先创建哪个Bean,因为它们依赖于彼此。在这种情况下,Spring会在加载上下文时,抛出一个BeanCurrentlyInCreationException。
当我们使用构造方法进行注入时,会遇到这种情况。因为它是上下文加载就被要求注入。
三、结论
有很多方法可以处理循环依赖关系。首先要考虑的是重新设计你的bean,这样就不需要循环依赖关系:它们通常是可以改进的设计的症状。但是,如果您绝对需要在项目中具有循环依赖项,则可以按照此处建议的一些解决方法进行操作。