前言
北京時(shí)間2021-11-17,Spring Boot 2.6.0正式發(fā)布。回憶一下上次發(fā)版還是上次,相比于2.5.0版本的打醬油,本次的升級點(diǎn)更猛些。
2.5.0版本的新特性在這里:【方向盤】Spring Boot 2.5.0正式發(fā)布,環(huán)境變量可指定前綴的功能很贊)
說明:Spring Boot 2.6.1隨后作為補(bǔ)丁版本立馬發(fā)布了,修復(fù)了若干問題。因此保持習(xí)慣,生產(chǎn)上請盡量保持最新的(小)版本
所屬專欄
- 【方向盤】-Spring Boot新特性
相關(guān)下載
- 【本專欄源代碼】:https://github.com/yourbatman/FXP-java-ee
- 【技術(shù)專欄源代碼大本營】:https://github.com/yourbatman/tech-column-learning
- 【女媧Knife-Initializr工程】訪問地址:http://152.136.106.14:8761
- 【程序員專用網(wǎng)盤】公益上線啦,注冊送1G超小容量,幫你實(shí)踐做減法:https://wangpan.yourbatman.cn
- 【Java開發(fā)軟件包(Mac)】:https://wangpan.yourbatman.cn/s/rEH0 提取碼:javakit
版本約定
Spring Boot 2.6.0
正文
關(guān)于版本號,從2.4.x 版本開始版本號不帶 .RELEASE 后綴了!通過表格描述下Spring Boot各個(gè)版本現(xiàn)在的更新、維護(hù)狀況:
Spring Boot每年會在5月份和11月份發(fā)布兩個(gè)中型版本(一般都會有部分不向下兼容的情況,升級需謹(jǐn)慎),每個(gè)中型版本提供1年的支持(免費(fèi)),提供2年+的商業(yè)支持(付費(fèi))。按此節(jié)奏可知:Spring Boot 2.6.0發(fā)布也宣布著2.4.x版本停止(免費(fèi))支持,而2.7.0版本預(yù)計(jì)會在2022年的5月份和大家見面。
2.6版本主要新特性
禁止循環(huán)引用
Spring Boot終究忍不住,禁止(Bean的)循環(huán)引用了!!!
注意:只是Spring Boot默認(rèn)禁止了,但Spring Framework默認(rèn)還是允許的哦
對于有代碼潔癖的開發(fā)者來說,看到循環(huán)引用的代碼是“不舒服”的。在業(yè)務(wù)開發(fā)中,有一種聲音是:循環(huán)引用不可避免,但實(shí)際上應(yīng)該思考:若出現(xiàn)了循環(huán)引用,必定是結(jié)構(gòu)設(shè)計(jì)上不合理導(dǎo)致,有優(yōu)化空間!若你是個(gè)有追求的程序員,是可以很容易發(fā)現(xiàn)這種不合理的。
什么是循環(huán)引用?
如圖,循環(huán)引用一般指A引用B,B又引用了A。更極端一點(diǎn)的循環(huán)引用case可以是:A引用A,本文將以此為例進(jìn)行代碼演示。
什么是循環(huán)依賴?它是循環(huán)引用的一種具象形式,如Spring Bean之間的循環(huán)依賴就屬于循環(huán)引用。大多數(shù)情況下,可認(rèn)為循環(huán)依賴和循環(huán)引用語義上是相同的。
在Spring Boot場景下,準(zhǔn)備Bean循環(huán)依賴的基礎(chǔ)代碼:
- /**
- * 在此處添加備注信息
- *
- * @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("循環(huán)依賴:" + (this == aService));
- }
- }
2.6.0之前版本(以2.5.x為例)
-
-
org.springframework.boot -
spring-boot-starter-parent -
2.5.7
啟動Spring Boot應(yīng)用,控制臺輸出:
結(jié)果:正常啟動。這便是我們口頭上常說的:Spring已經(jīng)解決了Bean的循環(huán)依賴問題
2.6.0及之后版本
-
-
org.springframework.boot -
spring-boot-starter-parent -
2.6.0
啟動Spring Boot應(yīng)用,控制臺輸出:
結(jié)果:啟動失敗。這便是從Spring Boot 2.6.0版本起禁止了循環(huán)引用的結(jié)果
如何解決循環(huán)引用?
文上有說到,循環(huán)引用屬于不合理的設(shè)計(jì),但并非不能正常工作。這就像每個(gè)程序員都吐槽過屎山代碼依舊能正常work同一個(gè)道理:它不好,但有意義。
既然“不合理”,那就有理由規(guī)避。針對循環(huán)引用的解決方案,總結(jié)一下主要有兩種:
確保循環(huán)引用不再存在:整改/優(yōu)化業(yè)務(wù)邏輯
允許循環(huán)引用:無需改代碼
方案一:確保循環(huán)引用不再存在
好,這很好!難,這很難!本方案是最好的,也是最難的,Spring團(tuán)隊(duì)當(dāng)然最喜歡你這么去做,做難事必有所得嘛!
從Spring Boot 2.6.0開始的這個(gè)默認(rèn)行為(不允許循環(huán)引用)能感受到:循環(huán)引用的編碼方式是不被推薦的,是壞味道的代碼。為此,期望正在看本文的coder給自己立個(gè)flag哈:不再寫循環(huán)引用的代碼,盡量吧