一、什么是循环依赖
在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方法解决比较方便快捷,当然时间足够肯定重构最好啦