SpringBoot循环依赖解决
一、循环依赖是什么?我们了解到SpringBoot通过注解componentScan注解。将Bean注入到Spring容器、那么在注入过程中,如遇到这样的问题在将BeanA注入到容器中的过程中:BeanA持有BeanB的引用,BeanB持有BeanC的引用。BeanC持有BeanA的引用、当BeanA注入依赖于BeanC,BeanC又依赖于BeanA。如此循环,就会导致BeanCurrentlyI
一、循环依赖是什么?
我们了解到SpringBoot通过注解componentScan注解。将Bean注入到Spring容器、那么在注入过程中,如遇到这样的问题在将BeanA注入到容器中的过程中:BeanA持有BeanB的引用,BeanB持有BeanC的引用。BeanC持有BeanA的引用、当BeanA注入依赖于BeanC,BeanC又依赖于BeanA。如此循环,就会导致BeanCurrentlyInCreationException异常.
这就是我们常遇见的SpringBoot循环依赖的问题、通常发生在通过构造器创建Bean之间的依赖关系的时候。
二、我们如何解决循环依赖的问题勒 ?
首先我们知道问题在于通过构造器来依赖注入。
那么我们可以考虑从如下几个方面去处理循环依赖的问题、
2.1、改变代码结构、
即我们不要出现BeanA-BeanB-BeanC-BaenA的这种依赖的结构。
2.2、改变构造器初始化Bean依赖关系
容器构造是指在容器启动的时候,依赖关系已经建议好了、那么我们就要去避免容器初始化的时候去建议依赖关系、
2.2.1 通过懒加载的方式.
@Component
public class CircularDependencyA {
private CircularDependencyB circB;
@Autowired
public CircularDependencyA(@Lazy CircularDependencyB circB) {
this.circB = circB;
}
}
2.2.1通过setter在使用的时候在注入依赖
@Component
public class CircularDependencyA {
private CircularDependencyB circB;
@Autowired
public void setCircB(CircularDependencyB circB) {
this.circB = circB;
}
public CircularDependencyB getCircB() {
return circB;
}
}
处理循环依赖有多种方式。首先考虑是否能够通过重新设计依赖来避免循环依赖。如果确实需要循环依赖,那么可以通过前文提到的方式来处理。优先建议使用setter注入来解决。
更多推荐
所有评论(0)