SpringBoot循环依赖如何解决

一、什么是循环依赖

在Spring通过componentScan注解将Bean注入容器的过程中,如果BeanA依赖BeanB,而BeanB又依赖BeanA就会出现问题,Spring将无法决定先创建哪个bean,这种情况下,Spring将产生异常BeanCurrentlyInCreationException

二、如何解决

假设,现在有两个方法互相调用,这时候Spring进行初始化就不知道先加载哪个而报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ClassA {

@Autowired

ClassB classB;

}

public class ClassB {

@Autowired

ClassA classA

}

1. 最好的解决方案肯定是重构,对代码进行解耦

2.使用@Lazy注解

通过@Lazy注解使得对象得以延迟加载,初始化时,先对代理对象进行注入,再首次使用时,再创建对象注入

1
2
3
4
5
6
7
8
9
10
@Component
public class CircularDependencyA {

private CircularDependencyB circB;

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

3.使用Setter/Field注入

通过这种方式,使得依赖在最终使用的时候才进行注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Component
public class CircularDependencyA {

private CircularDependencyB circB;

@Autowired
public void setCircB(CircularDependencyB circB) {
this.circB = circB;
}

public CircularDependencyB getCircB() {
return circB;
}
}

建议使用2,3方法解决比较方便快捷,当然时间足够肯定重构最好啦