https://cloud.tencent.com/developer/article/1464430

什么是循环依赖

当一个ClassA依赖于ClassB,然后ClassB又反过来依赖ClassA,这就形成了一个循环依赖:

ClassA -> ClassB -> ClassA

原创声明

本文发布于掘金号【Happyjava】。Happy的掘金地址:juejin.im/user/5cc289…,Happy的个人博客:(blog.happyjava.cn)\[blog.happyjava.cn\]。欢迎转载,但须保留此段声明。

Spring的循环依赖问题

当你使用构造注入依赖的时候,就有可能发生循环依赖然后报错的问题。什么是构造注入呢?可以看如下代码:

假设有ClassA和ClassB如下:

ClassA.java

@Data
@Component
public class ClassA {

    private final ClassB classB;

    public ClassA(ClassB classB) {
        this.classB = classB;
    }
}

复制代码

ClassB.java

@Data
@Component
public class ClassB {

    private final ClassA classA;

    public ClassB(ClassA classA) {
        this.classA = classA;
    }
}
复制代码

就是在类的构造方法里,把依赖注入,这就是所说的构造注入。

构造注入,也是Spring团队推荐的Spring依赖注入的方式(依赖来自IDEA的提示):

https://ask.qcloudimg.com/raw/yehe-1936277a5f7ec70/gmpuhplbze.png

虽然是Spring的官方推荐,但是这种方式就是容易出现循环依赖导致程序跑不起来的情况:

https://ask.qcloudimg.com/raw/yehe-1936277a5f7ec70/rml0wxbdeh.png