一、循环依赖是什么?
我们了解到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; @Resource public CircularDependencyA(@Lazy CircularDependencyB circB) { this.circB = circB; } }
2.2.1通过setter在使用的时候在注入依赖
@Component public class CircularDependencyA { private CircularDependencyB circB; @Resource public void setCircB(CircularDependencyB circB) { this.circB = circB; } public CircularDependencyB getCircB() { return circB; } }
处理循环依赖有多种方式。首先考虑是否能够通过重新设计依赖来避免循环依赖。如果确实需要循环依赖,那么可以通过前文提到的方式来处理。优先建议使用setter注入来解决。
参考:https://blog.csdn.net/weixin_44399827/article/details/120660899
本站文章除注明转载/出处外,均为原创,若要转载请务必注明出处。转载后请将转载链接通过邮件告知我站,谢谢合作。本站邮箱:admin@only4.work
尊重他人劳动成果,共创和谐网络环境。点击版权声明查看本站相关条款。