在Spring框架中,循环依赖是指两个或多个Bean互相依赖,其中一个Bean依赖另一个Bean,而另一个Bean又依赖第一个Bean,形成一个循环依赖关系。当使用getBean
方法获取一个循环依赖的Bean时,Spring容器会抛出BeanCurrentlyInCreationException
异常,因为它无法在循环依赖的情况下完成Bean的创建。
为了解决循环依赖问题,Spring框架提供了三种解决方案:
@Lazy
注解:通过在Bean的依赖注入处使用@Lazy
注解,可以延迟加载Bean的创建,从而解决循环依赖问题。@Component
public class A {
private B b;
@Autowired
@Lazy
public void setB(B b) {
this.b = b;
}
}
@Component
public class B {
private A a;
@Autowired
public void setA(A a) {
this.a = a;
}
}
@DependsOn
注解:通过在Bean的定义处使用@DependsOn
注解,可以指定Bean的创建顺序,从而解决循环依赖问题。@Component
@DependsOn("b")
public class A {
private B b;
@Autowired
public void setB(B b) {
this.b = b;
}
}
@Component
@DependsOn("a")
public class B {
private A a;
@Autowired
public void setA(A a) {
this.a = a;
}
}
@Component
public class A {
private B b;
@Autowired
public A(B b) {
this.b = b;
}
}
@Component
public class B {
private A a;
@Autowired
public B(A a) {
this.a = a;
}
}
通过以上三种解决方案,可以有效地解决循环依赖问题,并确保Bean的正确创建和注入。