小墨の博客

梦想需要付诸行动,否则只能是梦

SpringBoot循环依赖解决



一、循环依赖是什么?

我们了解到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

尊重他人劳动成果,共创和谐网络环境。点击版权声明查看本站相关条款。

    发表评论:

    搜索
    本文二维码
    标签列表
    站点信息
    • 文章总数:511
    • 页面总数:20
    • 分类总数:92
    • 标签总数:208
    • 评论总数:62
    • 浏览总数:231783

    | | |
    | |  Z-Blog PHP