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

SpringBoot已经禁掉了循环依赖!

还在问循环依赖嘛?SpringBoot已经禁掉了循环依赖!

首发2023-12-18 11:26·yuan人生

如果现在面试时还有人问你循环依赖,你就这样怼他:循环依赖是一种代码质量低下的表现,springboot2.6之后的版本已经默认禁用了。

Spring的bean管理一直是spring的核心。spring循环依赖也成了面试问的重点。但实际上,项目中存在Bean的循环依赖,是代码质量低下的表现。如果每个bean划分好功能、业务边界,就不会出现这种情况。很多开发者不去考虑这些,只是怎么方便怎么来,导致都寄希望于框架层来解决问题,造成了整个代码的设计越来越糟,最后用一些奇技淫巧来填补犯下的错误。

SpringBoot终于忍受不了这种滥用,从2.6版本开始默认禁用了循环依赖!如果你的项目里还存在循环依赖,SpringBoot将拒绝启动!

spring官方说明

验证代码:

pom.xml引入springboot2.6

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.0</version><relativePath/> 
</parent>

serviceA

@Service
public class ServiceA {@Resourceprivate ServiceB serviceB;
}

serviceB

@Service
public class ServiceB {@Resourceprivate ServiceA serviceA;
}

启动报错:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.

2023-12-18 11:04:31.862 INFO 34320 --- [ main] o.e.l.MySpringApplicationRunListener : failed 2023-12-18T11:04:31.862

2023-12-18 11:04:31.882 ERROR 34320 --- [ 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:

┌─────┐

| serviceA

↑ ↓

| serviceB

└─────┘

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.

Disconnected from the target VM, address: '127.0.0.1:64568', transport: 'socket'

Process finished with exit code 1

从报错的信息可以看出,springboot完全没有割裂这种行为。你也可以在配置中开启循环依赖。

spring.main.allow-circular-references=true

spring可能考虑到旧项目的升级的问题,没有完全割裂。但是开发者自身应当知道这是一种代码质量低下的表现。并且就是2.6之前的版本也解决不了构造方法注入,或者开启原型模式下的循环依赖。这种低质量代码随着现在项目越来越复杂、工程越来越庞大,肯定是会被摒弃。

http://www.lryc.cn/news/263748.html

相关文章:

  • 【.NET Core】反射(Reflection)详解(一)
  • jenkins入门
  • HarmonyOS --- 首页(新新新手版,高手误入)
  • springboot升级到3.2导致mybatis-plus启动报错
  • 浏览器原理篇—渲染原理
  • idea安装
  • 用Flask搭建简单的web模型部署服务
  • PCL 点云匹配 3 之 (非线性迭代点云匹配)lM-ICP
  • 【C语言】SCU安全项目2-BufBomb
  • C++第一讲之初入C++
  • 如何实现公网访问本地内网搭建的WBO白板远程协作办公【内网穿透】
  • js知识点1:防抖节流
  • 虚拟机下Ubuntu上网设置
  • Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)
  • 【微服务】服务间调用
  • 一句话分清C/C++声明和定义
  • 《哥德尔证明》阅读笔记——初等命题逻辑的一致性证明过程
  • 迪文屏开发保姆级教程—弹出键盘录入ASCII字符
  • Java,处理字符串的案例()
  • 微信小程序更新机制
  • CentOS 7 部署 Nacos-2.3.0 (单机版)
  • Springboot优雅实现对接口返回统一封装
  • Kafka 安装与部署
  • 计算 N*4*4 位姿形状的逆变换,在N*3*4位姿后补充 [0,0,0,1]
  • 人工智能可以战胜人类智慧大脑么?
  • 【数据结构和算法】 K 和数对的最大数目
  • 基于ssm高校推免报名系统源码和论文
  • 算法设计与分析2023秋-头歌实验-实验七 动态规划
  • 复杂 SQL 实现分组分情况分页查询
  • JavaScript---如何完美的判断返回对象是否有值