一、循环依赖是什么?

我们了解到SpringBoot通过注解componentScan注解。将Bean注入到Spring容器、那么在注入过程中,如遇到这样的问题在将BeanA注入到容器中的过程中:BeanA持有BeanB的引用,BeanB持有BeanC的引用。BeanC持有BeanA的引用、当BeanA注入依赖于BeanC,BeanC又依赖于BeanA。如此循环,就会导致BeanCurrentlyInCreationException异常.

这就是我们常遇见的SpringBoot循环依赖的问题、通常发生在通过构造器创建Bean之间的依赖关系的时候。

二、我们如何解决循环依赖的问题勒 ?

首先我们知道问题在于通过构造器来依赖注入。

那么我们可以考虑从如下几个方面去处理循环依赖的问题、

2.1、改变代码结构、

即我们不要出现BeanA-BeanB-BeanC-BaenA的这种依赖的结构。

2.2、改变构造器初始化Bean依赖关系

容器构造是指在容器启动的时候,依赖关系已经建议好了、那么我们就要去避免容器初始化的时候去建议依赖关系、

2.2.1 通过懒加载的方式.

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

 2.2.1通过setter在使用的时候在注入依赖

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

 处理循环依赖有多种方式。首先考虑是否能够通过重新设计依赖来避免循环依赖。如果确实需要循环依赖,那么可以通过前文提到的方式来处理。优先建议使用setter注入来解决。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐