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.Driver
      url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
      username: root
      password: 123456

  devtools:
    restart:
      # 设置不参与热部署的文件或文件夹
      exclude: static/**,public/**,config/application.yml

  main:
    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

相关推荐
yours_Gabriel7 分钟前
【SpringBoot问题】IDEA中用Service窗口展示所有服务及端口的办法
java·微服务·springboot
九转成圣1 小时前
Spring Boot 同时接受文件和实体及 Postman 测试实战
spring boot·后端·postman
wclass-zhengge2 小时前
02微服务系统与设计(D1_走出微服务误区:避免从单体到分布式单体)
分布式·微服务·架构
顽疲2 小时前
springboot vue 开源 会员收银系统 (10) 销单 销单后会员卡余额及库存优化
vue.js·spring boot·开源
南山十一少2 小时前
Spring Boot 实战:基于 Validation 注解实现分层数据校验与校验异常拦截器统一返回处理
java·前端·spring boot·后端
vampire-wpre2 小时前
SpringBoot统一功能处理
spring boot
chusheng18402 小时前
Java 基于SpringBoot +Vue的4S 店车辆管理系统(附源码,说明文档,部署)
java·vue.js·spring boot·汽车管理系统·4s店汽车管理系统·4s 店汽车管理
餘yuqn3 小时前
Spring Security重写AuthenticationManager实现账号密码登录或者手机号码登录
spring boot·后端
nbsaas-boot3 小时前
秒杀系统三层架构设计:缓存、消息队列与数据库
数据库·缓存
尘浮生3 小时前
Java项目实战II基于Java+Spring Boot+MySQL的智慧养老中心管理系统(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·mysql·微信小程序·maven