admin 管理员组

文章数量: 1184232

什么是循环依赖问题

在 Spring 中,循环依赖问题指的是两个或多个 bean 之间相互依赖形成的闭环。具体而言,当 bean A 依赖于 bean B,同时 bean B 也依赖于 bean A,就形成了循环依赖。

循环依赖问题在 Spring 容器中是一个非常常见的情况,但默认情况下,Spring 容器是不支持循环依赖的。当出现循环依赖时,Spring 容器会抛出 BeanCurrentlyInCreationException 异常,指示循环依赖无法解决。

下面是一种常见的循环依赖示例

循环依赖代码演示

class BeanA {
    private BeanB b;

    public void setB(BeanB b) {
        this.b = b;
    }
}

class BeanB {
    private BeanA a;

    public void setA(BeanA a) {
        this.a = a;
    }
}

在示例里,BeanA 依赖于 BeanB,同时 BeanB 也依赖于 BeanA,形成了循环依赖。

为了解决循环依赖问题,可以采取以下几种方法:

1. 使用 @Lazy 注解

将循环依赖的 bean 声明为懒加载(lazy)可以延迟初始化,从而解决循环依赖问题。通过将 @Lazy 注解应用于 bean 的声明,可以将其设置为懒加载。

@Component
@Lazy
class BeanA {
    private BeanB b;

    public void setB(BeanB b) {
        this.b = b;
    }
}

@Component
@Lazy
class BeanB {
    private BeanA a;

    public void setA(BeanA a) {
        this.a = a;
    }
}

通过使用 @Lazy 注解,Spring 容器将在需要时延迟初始化循环依赖的 bean。

2. 使用 @Autowired@Qualifier 注解

在循环依赖的字段或 setter 方法上使用 @Autowired 注解,并结合 @Qualifier 注解明确指定依赖的 bean。这种方式要求依赖项必须是接口类型。

interface BeanA {
    void setB(BeanB b);
}

interface BeanB {
    void setA(BeanA a);
}

@Component
class BeanAImpl implements BeanA {
    private BeanB b;

    @Autowired
    public void setB(@Qualifier("beanBImpl") BeanB b) {
        this.b = b;
    }
}

@Component
class BeanBImpl implements BeanB {
    private BeanA a;

    @Autowired
    public void setA(@Qualifier("beanAImpl") BeanA a) {
        this.a = a;
    }
}

本文标签: 三种 如何解决 方法 Spring