我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring Boot循环依赖怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring Boot循环依赖怎么解决

本文小编为大家详细介绍“Spring Boot循环依赖怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot循环依赖怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    什么是循环依赖?

    循环依赖是指在Spring Boot 应用程序中,两个或多个类之间存在彼此依赖的情况,形成一个循环依赖链。在这种情况下,当一个类在初始化时需要另一个类的实例,而另一个类又需要第一个类的实例时,就会出现循环依赖问题。这会导致应用程序无法正确地初始化和运行,因为Spring Boot 无法处理这种循环依赖关系。

    问题及症状

    在2.6.0之前,Spring Boot会自动处理循环依赖的问题。2.6.0及之后的版本会默认检查循环依赖,存在该问题则会报错。

    ComponentA类注入ComponentB类,ComponentB类注入ComponentA类,就会发生循环依赖的问题。

    ComponentA

    import org.springframework.stereotype.Service;import javax.annotation.Resource; @Servicepublic class ComponentA {    @Resource    private ComponentB componentB; }

    ComponentB

    import org.springframework.stereotype.Service;import javax.annotation.Resource; @Servicepublic class ComponentB {     @Resource    private ComponentA componentA; }

    错误

    现在,2.6.0 这个版本已经默认禁止 Bean 之间的循环引用, 则基于上面的代码,会报错:

    ***************************APPLICATION FAILED TO START***************************Description:The dependencies of some of the beans in the application context form a cycle:┌─────┐|  componentA↑     ↓|  componentB└─────┘Action:Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

    解决方法

    循环依赖是指两个或更多的组件之间存在着互相依赖的关系。在Spring Boot应用程序中,循环依赖通常是由以下几种情况引起的:

    • 构造函数循环依赖:两个或更多的组件在它们的构造函数中互相依赖。

    • 属性循环依赖:两个或更多的组件在它们的属性中互相依赖。

    • 方法循环依赖:两个或更多的组件在它们的方法中互相依赖。

    Spring Boot提供了一些解决循环依赖的方法:

    1. 构造函数注入:在构造函数中注入依赖项,而不是在属性中注入。

    2. Setter注入:使用setter方法注入依赖项,而不是在构造函数中注入。

    3. 延迟注入:使用@Lazy注解延迟加载依赖项。

    4. @Autowired注解的required属性:将required属性设置为false,以避免出现循环依赖问题。

    5. @DependsOn注解:使用@DependsOn注解指定依赖项的加载顺序,以避免出现循环依赖问题

    构造器注入的案例

    假设有以下两个类:

    public class A {    private B b;    public A() {        // ...    }    public void setB(B b) {        this.b = b;    }}public class B {    private A a;    public B() {        // ...    }    public void setA(A a) {        this.a = a;    }}

    通过构造函数注入可以避免循环依赖,改造后的代码如下:

    public class A {    private B b;    public A(B b) {        this.b = b;    }}public class B {    private A a;    public B(A a) {        this.a = a;    }}

    这样,在创建 A 实例时,只需要将 B 实例传递给 A 的构造函数即可,不需要再通过 setter 方法将 B 实例注入到 A 中。同理,在创建 B 实例时,只需要将 A 实例传递给 B 的构造函数即可,不需要再通过 setter 方法将 A 实例注入到 B 中。这样可以避免循环依赖。

    延迟注入的案例

    假设有如下情景:

    类A依赖于类B,同时类B也依赖于类A。这样就形成了循环依赖。

    为了解决这个问题,可以使用@Lazy注解,将类A或类B中的其中一个延迟加载。

    例如,我们可以在类A中使用@Lazy注解,将类A延迟加载,这样在启动应用程序时,Spring容器不会立即加载类A,而是在需要使用类A的时候才会进行加载。这样就避免了循环依赖的问题。

    示例代码如下:

    @Componentpublic class A {    private final B b;    public A(@Lazy B b) {        this.b = b;    }    //...}@Componentpublic class B {    private final A a;    public B(A a) {        this.a = a;    }    //...}

    在类A中,我们使用了@Lazy注解,将类B延迟加载。这样在启动应用程序时,Spring容器不会立即加载类B,而是在需要使用类B的时候才会进行加载。

    这样就避免了类A和类B之间的循环依赖问题。

    接口隔离的案例

    假设有两个类A和B,它们之间存在循环依赖:

    public class A {    private final B b;    public A(B b) {        this.b = b;    }}public class B {    private final A a;    public B(A a) {        this.a = a;    }}

    这时候,如果直接在Spring Boot中注入A和B,就会出现循环依赖的问题。为了解决这个问题,可以使用接口隔离。

    首先,定义一个接口,包含A和B类中需要使用的方法:

    public interface Service {    void doSomething();}

    然后,在A和B类中分别注入Service接口:

    public class A {    private final Service service;    public A(Service service) {        this.service = service;    }}public class B {    private final Service service;    public B(Service service) {        this.service = service;    }}

    最后,在Spring Boot中注入Service实现类:

    @Servicepublic class ServiceImpl implements Service {    private final A a;    private final B b;    public ServiceImpl(A a, B b) {        this.a = a;        this.b = b;    }    @Override    public void doSomething() {        // ...    }}

    通过这种方式,A和B类不再直接依赖于彼此,而是依赖于同一个接口。同时,Spring Boot也能够正确地注入A、B和ServiceImpl,避免了循环依赖的问题。

    读到这里,这篇“Spring Boot循环依赖怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Spring Boot循环依赖怎么解决

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Spring Boot循环依赖怎么解决

    本文小编为大家详细介绍“Spring Boot循环依赖怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot循环依赖怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是循环依赖?循
    2023-07-05

    Spring循环依赖问题怎么解决

    在Spring中,循环依赖问题是指两个或多个bean之间出现相互依赖的情况。由于Spring容器默认使用单例模式管理bean,因此循环依赖可能导致bean无法正确创建。解决Spring循环依赖问题,可以尝试以下方法:1. 避免使用构造函数注
    2023-08-31

    怎么理解Spring循环依赖

    本篇内容介绍了“怎么理解Spring循环依赖”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通常来说,如果问Spring内部如何解决循环依赖,
    2023-06-16

    Spring轻松解决循环依赖

    Spring的解决循环依赖是有前置条件的,要解决循环依赖我们首先要了解SpringBean对象的创建过程和依赖注入的方式。依赖注入方式,我之前的博客有所分享,大家可以在看本篇文章之前进行一下小小的回顾
    2023-05-16

    Spring循环依赖产生与解决

    Spring的解决循环依赖是有前置条件的,要解决循环依赖我们首先要了解SpringBean对象的创建过程和依赖注入的方式。依赖注入方式,我之前的博客有所分享,大家可以在看本篇文章之前进行一下小小的回顾
    2022-12-20

    Spring循环依赖的解决方法

    这篇文章主要介绍Spring循环依赖的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!循环依赖其实就是循环引用,很多地方都说需要两个或则两个以上的bean互相持有对方最终形成闭环才是循环依赖,比如A依赖于B,B
    2023-06-06

    怎么在spring中解决循环依赖问题

    怎么在spring中解决循环依赖问题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。setter singleton循环依赖使用SingleSetterBeanA依赖Sing
    2023-06-08

    spring循环依赖问题如何解决

    本篇内容介绍了“spring循环依赖问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、三种循环依赖的情况①构造器的循环依赖:这种
    2023-07-02

    如何解决Spring循环依赖问题

    本文小编为大家详细介绍“如何解决Spring循环依赖问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何解决Spring循环依赖问题”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。公共代码package com
    2023-07-02

    怎么理解java中Spring循环依赖

    这篇文章主要介绍“怎么理解java中Spring循环依赖”,在日常操作中,相信很多人在怎么理解java中Spring循环依赖问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解java中Spring循环依赖
    2023-06-16

    Spring源码是怎么解决Bean的循环依赖

    这篇文章给大家分享的是有关Spring源码是怎么解决Bean的循环依赖的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先需要明白一点,只有scop为(singleton)单例类型的Bean,spring才支持循环
    2023-06-22

    spring循环依赖解决的方法是什么

    Spring循环依赖是指两个或多个Bean之间存在相互依赖的情况。在Spring容器启动时,如果存在循环依赖,会抛出BeanCurrentlyInCreationException异常。Spring提供了三种解决循环依赖的方式:1. 构造器
    2023-09-27

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录