前言
北京時間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哈:不再寫循環引用的代碼,盡量吧