解决Spring Boot 2.6及之后版本取消了循环依赖的支持的问题

目录

1、问题:

2、报错:

3、解决方案:


1、问题:

        循环依赖指的是两个或者多个bean之间相互依赖,形成一个闭环。直接表现为两个service层互相调用对方。


此时会遇到以下问题:

2、报错:

当启动项目时,可能出现程序不能启动的情况,查看调试日志,会提示:

The dependencies of some of the beans in the application context form a cycle...

如下图所示: 

 根据上述代码片段,应用程序存在以下循环依赖:

1. adminBorrowInfoController 依赖 borrowInfoServiceImpl

2. borrowInfoServiceImpl 依赖 lendServiceImpl

3. lendServiceImpl 依赖 lendItemServiceImpl

4. lendItemServiceImpl 又反过来依赖 lendServiceImpl

这样就形成了一个循环依赖的场景。

原因是SpringBoot 从 2.6.0 开始默认不允许出现 Bean 循环引用。而且这个是在Bean 定义上也就是类上就不允许出现循环引用。


3、解决方案:


第1种、在全局配置文件设置允许循环引用存在:

升级到Spring Boot 2.7及以上版本,可以通过spring.main.allow-circular-references=true配置属性明确开启循环依赖支持。

但我用的2.6.11也可以哦,2.6以上的可以试试。

spring:main:allow-circular-references:true


第2种、在SpringApplicationBuilder 添加设置允许循环引用:

使用SpringApplicationBuilder来启动Spring Boot应用,并通过allowCircularReferences(true)方法开启了循环依赖支持。

public static void main(String[] args) {new SpringApplicationBuilder(DemoApplication.class).allowCircularReferences(true).run(args);
}

第N种、还有很多种供大家了解使用

1. 构造器注入

        - 在类中定义构造器,添加需要依赖的类作为参数
        - 使用@Autowired注解构造器
        - Spring会先实例化依赖类,然后通过构造器注入

2. @Lazy

        - 在导致循环依赖的Bean上添加@Lazy注解
        - Spring会延迟初始化这些Bean,先完成非Lazy的Bean初始化
        - 然后再通过setter注入完成Lazy Bean的初始化

3. ObjectFactory

        - 定义ObjectFactory属性,类型为对应类的ObjectFactory
        - Spring会代理注入ObjectFactory,获取对象时才初始化目标Bean

4. 服务定位器

        - 定义一个统一的服务定位器类
        - Bean直接从定位器获取依赖对象,而不是注入依赖

5. 合并类

        - 将互相依赖的类合并为一个类,避免相互依赖

6. 事件回调

        - 使用事件或者回调方式实现解耦
        - 一个类通过事件通知另一个类执行操作,而不是直接调用

7. 接口编程

        - 类依赖接口,不依赖具体实现
        - 具体实现通过setter注入接口

以上是一些主要的具体实现步骤,可以根据实际情况选择适合的方案。 


总体上,出现循环依赖通常意味着系统设计需要优化和解耦,需要重新梳理服务的职责和依赖关系,减少不必要的互相依赖,以提高内聚性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60063.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Shell】基础语法(三)

文章目录 一、Shell基础语法1. 位置参数和特殊变量2. 输入输出3. 管道4. 文件重定向5. 函数6. 脚本调试方法 二、Shell高级和正则表达式1. sort命令2. uniq命令3. wc命令4. grep命令5. find命令6. xargs7. sed命令8. crontab 一、Shell基础语法 1. 位置参数和特殊变量 $0 …

wordpress 打开缓慢处理

gravatar.com 头像网站被墙 追踪发现请求头像时长为21秒 解决方案一 不推荐,容易失效,网址要是要稳定为主,宁愿头像显示异常,也不能网址打不开 网上大部分搜索到的替换的CDN网址都过期了,例如:gravatar.du…

ArcGIS Pro实践技术应用暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用

GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的…

css-4:元素水平垂直居中的方法有哪些?如果元素不定宽高呢?

1、背景 在开发中,经常遇到这个问题,即让某个元素的内容在水平和垂直方向上都居中,内容不仅限于文字,可能是图片或其他元素。 居中是一个非常基础但又是非常重要的应用场景,实现居中的方法存在很多,可以将这…

EPS FB 2.5S返回时延占比提升

一、 EPS FB 2.5s指标现状 3月初某区域的EPS FB返回时延占比为82.7%左右,离目标值83.98%还有1.2%。 二、 原因分析 EPS FB语音挂机后,UE在LTE恻可以通过快速返回Fast Return功能快速回到SA模式,4G侧快速返回功能为: 1、NR Coverage-Trigger…

【深度学习笔记】深度学习框架

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: 神经网络和…

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

Unlikely argument type for equals(): String seems to be unrelated to T

Unlikely argument type for equals(): String seems to be unrelated to Integer Unlikely argument type for equals(): String seems to be unrelated to Date 多余代码

twisted 18.7.0 requires PyHamcrest>=1.9.0 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

设计模式-简单工厂模式(静态工厂模式)java实现

介绍 简单工厂模式根据所提供的参数数据返回几个可能类中的一个类的实例。通常返回的类都有一个公共的父类和公共的方法。 意图 提供一个类,负责根据一定的条件创建某一具体类的实例。同时使用工厂模式也是为了隐藏创建对象的过程 角色及其职责 (1)工厂(Creator…

axios的使用和接口请求统一封装处理

axios官网:axios中文网|axios API 中文文档 | axios 简单封装:配置基础路径和超时时间,还有请求拦截器和响应拦截器 //对axios进行二次封装 import axios from axios//1、利用axios对象的方法create,去创建一个axios实例 const requests …

生信分析pandas数据处理 Python简明教程 | 视频17

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…