解决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注入接口

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


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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot 2.6Spring Boot框架的最新版本Spring Security是一个基于Spring框架的安全性控制框架。 Spring Boot 2.6相比之前的版本,带来了许多新功能和改进。它提供了更好的性能和稳定性,同时也修复了一些先前版本中存在的漏洞和问题。此外,Spring Boot 2.6还增加了一些新的特性,例如对Java 17的全面支持、改进的响应式编程支持以及集成的监视和管理功能等。这些改进使得Spring Boot更易用、更强大,能够更好地满足开发人员的需求。 而Spring Security作为Spring框架的一个重要模块,主要用于实现身份验证和授权功能。它提供了强大的安全性控制机制,可用于保护Web应用程序、RESTful API和微服务等。Spring Security提供了多种认证和授权方式,包括基于传统的用户名和密码、Token认证、OAuth2、LDAP认证等。它还支持自定义的权限验证规则,使开发人员能够灵活地定义和管理用户的访问权限。 Spring Security与Spring Boot 2.6的结合使用能够极大地简化安全性配置和集成。Spring Boot 2.6提供了对Spring Security的自动化配置,使得开发人员无需手动配置大量的安全性相关设置,而是可以通过简单的注解和配置实现安全性控制。此外,Spring Boot 2.6还提供了与其他安全性框架和技术的集成,如Spring Session、Spring Actuator和Spring Cloud Security等,使得开发人员能够更便捷地实现应用程序的认证和授权功能。 总而言之,Spring Boot 2.6Spring Security是一对非常强大的组合。它们可以帮助开发人员快速构建安全可靠的应用程序,并提供灵活的安全性管理和配置选项。无论是开发Web应用程序还是微服务,使用Spring Boot 2.6Spring Security都能够提供优秀的安全性支持
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值