当前位置:   article > 正文

【方向盘】Spring Boot 2.6.0正式发布,循环引用终于被禁_禁止循环引用

禁止循环引用

天再高又怎样,踮起脚尖就更接近阳光。
本文已被https://yourbatman.cn收录;女娲Knife-Initializr工程可公开访问啦;程序员专用网盘https://wangpan.yourbatman.cn;技术专栏源代码大本营:https://github.com/yourbatman/tech-column-learning;公号后台回复“专栏列表”获取全部小而美的原创技术专栏

你好,我是方向盘(YourBatman)。笔者的公号是保留地,只分享原创,不转载、不发商务广告!

✍前言

北京时间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 2.6.0

✍正文

关于版本号,从2.4.x 版本开始版本号不带 .RELEASE 后缀了!通过表格描述下Spring Boot各个版本现在的更新、维护状况:

版本发布时间停止支持时间停止商业支持时间
2.6.x2021-11-172022-11-24(1年)2024-02-24(2年+)
2.5.x2021-05-202022-05-19(1年)2023-08-24(2年+)
2.4.x2021-11-122022-11-18(1年)2023-02-23(2年+)
2.3.x2020-05-162022-05-20(1年)2022-01-16(2年+)
2.2.x2019-10-162020-10-16(1年)2021-01-30(2年+)
2.1.x2018-10-302019-10-30(1年)2021-01-30(2年+)
2.0.x2018-03-012019-03-01(1年)2020-06-01(2年+)
1.5.x2017-01-302019-08-06(2.5年)2020-11-06(近4年)

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. <a href=mailto:yourbatman@aliyun.com>Send email to me</a>
 * @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));
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
2.6.0之前版本(以2.5.x为例)
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.7</version>
</parent>
  • 1
  • 2
  • 3
  • 4
  • 5

启动Spring Boot应用,控制台输出:
在这里插入图片描述
结果:正常启动。这便是我们口头上常说的:Spring已经解决了Bean的循环依赖问题

2.6.0及之后版本
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.0</version>
</parent>
  • 1
  • 2
  • 3
  • 4
  • 5

启动Spring Boot应用,控制台输出:
在这里插入图片描述
结果:启动失败。这便是从Spring Boot 2.6.0版本起禁止了循环引用的结果

如何解决循环引用?

文上有说到,循环引用属于不合理的设计,但并非不能正常工作。这就像每个程序员都吐槽过屎山代码依旧能正常work同一个道理:它不好,但有意义。

既然“不合理”,那就有理由规避。针对循环引用的解决方案,总结一下主要有两种:

  1. 确保循环引用不再存在:整改/优化业务逻辑
  2. 允许循环引用:无需改代码
方案一:确保循环引用不再存在

好,这很好!难,这很难!本方案是最好的,也是最难的,Spring团队当然最喜欢你这么去做,做难事必有所得嘛!

从Spring Boot 2.6.0开始的这个默认行为(不允许循环引用)能感受到:循环引用的编码方式是不被推荐的,是坏味道的代码。为此,期望正在看本文的coder给自己立个flag哈:不再写循环引用的代码,尽量吧

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/652180
推荐阅读
相关标签