社区编辑申请
注册/登录
痛快!SpringBoot终于禁掉了循环依赖!
开发 前端
绕过SpringBoot这个拦截的方法不止一种,比如使用@Lazy注解进行延迟初始化。但这些都是治标不治本,辜负了SpringBoot的一片苦心。

Spring的Bean管理,一直是整个体系中津津乐道的东西。尤其是Bean的循环依赖,更是很多面试官最喜欢考察的2B知识点之一。

但事实上,项目中存在Bean的循环依赖,是代码质量低下的表现。多数人寄希望于框架层来给擦屁股,造成了整个代码的设计越来越糟,最后用一些奇技淫巧来填补犯下的错误。

还好,SpringBoot终于受不了这种滥用,默认把循环依赖给禁用了!

从2.6版本开始,如果你的项目里还存在循环依赖,SpringBoot将拒绝启动!

验证代码小片段

为了验证这个功能,我们只需要两段小代码。

CircularDependencyA.java

@Component
@RequiredArgsConstructor
public class CircularDependencyA {
private final CircularDependencyB circB;
}

CircularDependencyB.java

@Component
@RequiredArgsConstructor
public class CircularDependencyB {
private final CircularDependencyA circA;
}

RequiredArgsConstructor注解,是lombok包里面的,用来实现简单的构造器注入。不出所料,当我们启动代码的时候,报错了~~

报错如下:

The dependencies of some of the beans in the application context form a cycle:
┌─────┐
| circularDependencyA defined in file [cir/CircularDependencyA.class]
↑ ↓
| circularDependencyB defined in file [cir/CircularDependencyB.class]
└─────┘

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.

当然,有些鸟人已经玩大了,循环依赖到处都是,改代码变的越来越不现实。那你还可以通过在yaml里配置参数来临时开启循环依赖。

spring.main.allow-circular-references=true

看来SpringBoot对恶势力的容忍能力还是不够坚决啊!

绕过SpringBoot这个拦截的方法不止一种,比如使用@Lazy注解进行延迟初始化。但这些都是治标不治本,辜负了SpringBoot的一片苦心。

做对的事其实,我们一直把代码往下找下去,会发现这个开关,其实是Spring的功能。

AbstractAutowireCapableBeanFactory#allowCircularReferences

/** Whether to automatically try to resolve circular references between beans. */
private boolean allowCircularReferences = true;

很长一段时间,SpringBoot这个值都是默认为true的。但这种纵容造成了大批低质量的代码产生,以至于新员工一直在给老员工埋坑。

把这个值默认设置为false,是坚持做对的事情。起码,在工程师编写出质量不高的代码时,能够知道他自己在做什么,而不是把隐患一步步的推迟,任代码腐败。

不得不为SpringBoot点个赞。真棒!

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。

责任编辑:武晓燕 来源: 小姐姐味道
相关推荐

2022-04-25 11:26:16

开发SpringBoot

2022-03-29 10:32:32

SpringBoot@Enable

2022-05-11 14:05:11

区块链网络安全存储

2022-04-20 07:48:09

微服务链路服务器

2022-05-25 10:04:43

Go编程

2022-03-31 07:52:01

Java多线程并发

2022-05-24 07:51:05

测试模型测试单元测试

2022-03-04 08:31:07

Spring异常处理

2022-04-14 13:48:33

MySQL数据库并发量

2022-04-19 11:23:26

release3.1子系统鸿蒙

2022-03-11 10:53:32

UML建模语言

2022-03-04 15:19:59

Spring BooJavaVert.x

2022-04-08 07:52:00

架构多机房多活

2022-04-18 09:41:14

Go架构设计

2022-05-06 14:19:02

边缘计算物联网5G

2022-02-22 08:30:12

Husky代码工作流

2022-05-07 10:20:17

truncatedeleteMySQL

2022-03-07 10:26:25

开源springboot项目

2022-04-01 11:41:00

智能技术数据库数据安全

2022-04-12 08:00:17

socket 编程网络编程网络 IO 模型

同话题下的热门内容

让程序员心动的11种新编程语言Flutter vs ReactJS:2022年应该选哪个?前端配置化真香~上班又多了60%的摸鱼时间再有人问你什么是分库分表,直接把这篇文章发给他2022年值得使用的 Node.js 框架HTTP 的缓存为什么这么设计?前端监控的搭建步骤,别再一头雾水了!如何加快Java中大型集合的处理

编辑推荐

太厉害了,终于有人能把TCP/IP协议讲的明明白白了!牛人5次面试腾讯不成功的经验HBase原理–所有Region切分的细节都在这里了Javascript如何监听页面刷新和关闭事件如何搭建一个HTTPS服务端
我收藏的内容
点赞
收藏

51CTO技术栈公众号