当前位置: 首页 > news >正文

Springboot微服务整合缓存的时候报循环依赖的错误 两种解决方案

错误再现

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2024-06-17 16:52:41.008 ERROR 20544 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : ***************************
APPLICATION FAILED TO START
***************************Description:The dependencies of some of the beans in the application context form a cycle:┌─────┐
|  redisAutoInit (field protected com.alicp.jetcache.anno.support.ConfigProvider com.alicp.jetcache.autoconfigure.AbstractCacheAutoInit.configProvider)
↑     ↓
|  springConfigProvider
└─────┘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.

简介

当应用程序上下文中的一些bean的依赖关系形成循环时,意味着这些bean之间存在循环依赖关系。换句话说,Bean A依赖于Bean B,同时Bean B又依赖于Bean A,形成一个闭环。这种情况通常发生在使用依赖注入框架(如Spring)管理bean之间的依赖关系时。

典型的循环依赖问题

循环依赖可能导致以下问题:

  1. 初始化问题:如果两个或多个bean彼此依赖,框架可能无法解析哪个bean应该先初始化,从而导致初始化失败或延迟。

  2. 运行时异常:常见的错误是BeanCurrentlyInCreationException,它表明Spring在尝试创建bean实例时检测到循环依赖。

  3. 代码的可维护性降低:循环依赖增加了组件之间的耦合性,使代码更难理解和维护。这可能使代码变得更脆弱,难以修改或测试。

如何处理循环依赖

在Spring中,有几种处理循环依赖的方法:

  1. 构造函数注入:首选使用构造函数注入而不是setter方法注入。构造函数注入有助于打破循环,因为所有依赖关系在bean实例化时都会被解析。

  2. 延迟注入:使用@Lazy注解延迟注入依赖关系。这可以推迟直到需要时才注入bean,从而可能打破循环。

  3. 方法注入:在某些情况下,可以使用方法注入并在方法上使用@Autowired注解。这种方法也可以帮助打破循环依赖。

  4. Aware接口:对于无法通过直接依赖注入解决的情况,可以考虑使用Aware接口,如ApplicationContextAwareBeanFactoryAware

  5. 使用代理解决:在某些情况下,Spring可以通过运行时代理来管理循环依赖。

最佳实践

  • 避免循环依赖:尽量避免设计中出现循环依赖。循环依赖通常表明设计可能需要重新审视,以增强模块化和降低耦合度。

  • 使用构造函数注入:构造函数注入通常是处理循环依赖的最佳实践,因为它使依赖关系更明确,并且有助于避免初始化顺序问题。

  • 进行代码审查和测试:对可能存在循环依赖的代码进行彻底的代码审查和测试,以尽早发现并解决问题。

处理循环依赖需要综合考虑应用程序的架构和设计。Spring提供了多种机制来处理这些情况,但理想情况下,应该尽量设计具有清晰依赖关系且避免循环依赖的代码结构。

两种解决方案

解决方案一

降低spingboot的版本

在pom.XML文件中去修改

 
<properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties>

解决方案二

在yml配置文件里配置属性

配置spring框架的属性

spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTCusername: rootpassword: 123456devtools:restart:# 设置不参与热部署的文件或文件夹exclude: static/**,public/**,config/application.ymlmain:allow-circular-references: true

主要是这一行 

这段配置看起来像是针对某种配置文件或框架的设置,其中 allow-circular-references: true 的意思是允许循环依赖。

在某些依赖注入框架(比如Spring)中,默认情况下是不允许循环依赖的,因为循环依赖可能导致初始化顺序问题或者在解析依赖关系时产生死锁。但有时候,循环依赖是不可避免的或者设计上是合理的,因此框架允许用户显式地设置来解决这类问题。

解释:

  • allow-circular-references: true:这个配置告诉框架或配置文件,允许在应用程序上下文中出现循环依赖。这意味着,如果两个或多个bean彼此依赖,并且形成了循环依赖,框架会尝试解决这些依赖关系而不会报错。

注意事项:

  • 慎重使用:虽然允许循环依赖可以解决特定情况下的问题,但过度依赖循环依赖可能导致代码难以理解和维护。

  • 替代解决方案:通常情况下,尝试避免设计上需要循环依赖的情况是更好的选择。可以考虑通过重构或者重新设计来减少循环依赖的发生。

  • 框架特定性:具体实现可能会有所不同,需要查阅相应框架的文档以了解详细的配置方法和影响。

总之,这种配置通常用于在特定场景下解决循环依赖问题,但使用时需要谨慎考虑其长期维护和代码质量的影响。

  main:allow-circular-references: true

成功启动

个人号推广

博客主页

多多!-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

相关文章:

  • 深入理解go语言反射机制
  • 电压互感器在线监测的原理
  • AI 大模型企业应用实战(10)-LLMs和Chat Models
  • AI大模型企业应用实战(14)-langchain的Embedding
  • Qt异常处理
  • 软件测试过程中用接口怎么将web系统的多页数据展示在1页
  • 罗盘时钟lua迷你世界
  • Parallels Desktop 19 for mac破解版安装激活使用指南
  • ArcgisEngine 释放内存案例
  • React 中的 ErrorBoundary
  • 数据分析:置换检验Permutation Test
  • 【JavaEE】Spring Web MVC详解
  • 【ajax核心05】宏任务与微任务
  • 【计算机网络】已解决:“‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件”报错
  • 2-14 基于matlab的GA优化算法优化车间调度问题
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【刷算法】求1+2+3+...+n
  • input实现文字超出省略号功能
  • JAVA多线程机制解析-volatilesynchronized
  • JS笔记四:作用域、变量(函数)提升
  • Linux后台研发超实用命令总结
  • Odoo domain写法及运用
  • socket.io+express实现聊天室的思考(三)
  • uni-app项目数字滚动
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 机器学习中为什么要做归一化normalization
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一个SAP顾问在美国的这些年
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​虚拟化系列介绍(十)
  • #大学#套接字
  • (23)mysql中mysqldump备份数据库
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (动态规划)5. 最长回文子串 java解决
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (理论篇)httpmoudle和httphandler一览
  • (十六)一篇文章学会Java的常用API
  • (转)linux 命令大全
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • **PHP二维数组遍历时同时赋值
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .NET开源项目介绍及资源推荐:数据持久层
  • @JoinTable会自动删除关联表的数据
  • @PreAuthorize注解
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [20180224]expdp query 写法问题.txt
  • [Angular 基础] - 数据绑定(databinding)
  • [Asp.net MVC]Bundle合并,压缩js、css文件