前言
北京时间2021-11-17,Spring Boot 2.6.0正式发布。回忆一下上次发版还是上次,相比于2.5.0版本的打酱油,本次的升级点更猛些。
2.5.0版本的新特性在这里:【方向盘】Spring Boot 2.5.0正式发布,环境变量可指定前缀的功能很赞)
说明:Spring Boot 2.6.1随后作为补丁版本立马发布了,修复了若干问题。因此保持习惯,生产上请尽量保持最新的(小)版本
所属专栏
- 【方向盘】-Spring Boot新特性
相关下载
- 【本专栏源代码】:https://github.com/yourbatman/FXP-java-ee
- 【技术专栏源代码大本营】:https://github.com/yourbatman/tech-column-learning
- 【女娲Knife-Initializr工程】访问地址:http://152.136.106.14:8761
- 【程序员专用网盘】公益上线啦,注册送1G超小容量,帮你实践做减法:https://wangpan.yourbatman.cn
- 【Java开发软件包(Mac)】:https://wangpan.yourbatman.cn/s/rEH0 提取码:javakit
版本约定
Spring Boot 2.6.0
正文
关于版本号,从2.4.x 版本开始版本号不带 .RELEASE 后缀了!通过表格描述下Spring Boot各个版本现在的更新、维护状况:
Spring Boot每年会在5月份和11月份发布两个中型版本(一般都会有部分不向下兼容的情况,升级需谨慎),每个中型版本提供1年的支持(免费),提供2年+的商业支持(付费)。按此节奏可知:Spring Boot 2.6.0发布也宣布着2.4.x版本停止(免费)支持,而2.7.0版本预计会在2022年的5月份和大家见面。
2.6版本主要新特性
禁止循环引用
Spring Boot终究忍不住,禁止(Bean的)循环引用了!!!
注意:只是Spring Boot默认禁止了,但Spring Framework默认还是允许的哦
对于有代码洁癖的开发者来说,看到循环引用的代码是“不舒服”的。在业务开发中,有一种声音是:循环引用不可避免,但实际上应该思考:若出现了循环引用,必定是结构设计上不合理导致,有优化空间!若你是个有追求的程序员,是可以很容易发现这种不合理的。
什么是循环引用?
如图,循环引用一般指A引用B,B又引用了A。更极端一点的循环引用case可以是:A引用A,本文将以此为例进行代码演示。
什么是循环依赖?它是循环引用的一种具象形式,如Spring Bean之间的循环依赖就属于循环引用。大多数情况下,可认为循环依赖和循环引用语义上是相同的。
在Spring Boot场景下,准备Bean循环依赖的基础代码:
- /**
- * 在此处添加备注信息
- *
- * @author YourBatman. Send email to me
- * @site https://yourbatman.cn
- * @date 2021/12/11 20:43
- * @since 0.0.1
- */
- @Service
- public class AService {
- @Autowired
- private AService aService;
- @PostConstruct
- private void init() {
- System.out.println("循环依赖:" + (this == aService));
- }
- }
2.6.0之前版本(以2.5.x为例)
-
-
org.springframework.boot -
spring-boot-starter-parent -
2.5.7
启动Spring Boot应用,控制台输出:
结果:正常启动。这便是我们口头上常说的:Spring已经解决了Bean的循环依赖问题
2.6.0及之后版本
-
-
org.springframework.boot -
spring-boot-starter-parent -
2.6.0
启动Spring Boot应用,控制台输出:
结果:启动失败。这便是从Spring Boot 2.6.0版本起禁止了循环引用的结果
如何解决循环引用?
文上有说到,循环引用属于不合理的设计,但并非不能正常工作。这就像每个程序员都吐槽过屎山代码依旧能正常work同一个道理:它不好,但有意义。
既然“不合理”,那就有理由规避。针对循环引用的解决方案,总结一下主要有两种:
确保循环引用不再存在:整改/优化业务逻辑
允许循环引用:无需改代码
方案一:确保循环引用不再存在
好,这很好!难,这很难!本方案是最好的,也是最难的,Spring团队当然最喜欢你这么去做,做难事必有所得嘛!
从Spring Boot 2.6.0开始的这个默认行为(不允许循环引用)能感受到:循环引用的编码方式是不被推荐的,是坏味道的代码。为此,期望正在看本文的coder给自己立个flag哈:不再写循环引用的代码,尽量吧