一、什么是循环依赖
在Spring通过componentScan注解将Bean注入容器的过程中,如果BeanA依赖BeanB,而BeanB又依赖BeanA就会出现问题,Spring将无法决定先创建哪个bean,这种情况下,Spring将产生异常BeanCurrentlyInCreationException
二、如何解决
假设,现在有两个方法互相调用,这时候Spring进行初始化就不知道先加载哪个而报错
public class ClassA {
@Autowired
ClassB classB;
}
public class ClassB {
@Autowired
ClassA classA
}
1. 最好的解决方案肯定是重构,对代码进行解耦
2.使用@Lazy注解
通过@Lazy注解使得对象得以延迟加载,初始化时,先对代理对象进行注入,再首次使用时,再创建对象注入
@Component
public class CircularDependencyA {
private CircularDependencyB circB;
@Autowired
public CircularDependencyA(@Lazy CircularDependencyB circB) {
this.circB = circB;
}
}
3.使用Setter/Field注入
通过这种方式,使得依赖在最终使用的时候才进行注入
@Component
public class CircularDependencyA {
private CircularDependencyB circB;
@Autowired
public void setCircB(CircularDependencyB circB) {
this.circB = circB;
}
public CircularDependencyB getCircB() {
return circB;
}
}
建议使用2,3方法解决比较方便快捷,当然时间足够肯定重构最好啦
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容