大家好,我是R哥。
距離《Spring Boot 3.0 正式發佈,王炸!!》已經 3 年了,Java 的世界經過了一次大變天,現在 Spring Boot 4.0 都來了,從 3.5 直接幹到了 4.0。
Spring Boot 4.0.0 正式發佈了:
最新的支持版本如下:
從路線圖可以看到每個版本的終止時間,每個版本的生命週期只有一年。
Spring Boot 3.3.x 及以下開源版本全部停止維護了,Spring Boot 3.4.x 馬上也要停止維護了,開源支持的版本馬上要進入 3.5+ 版本的時代了,商業支持的 3.x 最高版本版本 3.2.x、2.x 為 2.7.x。
Spring Boot 3.0+ 很快要成為過去式了,Spring Boot 馬上要進入了全新的 4.0+ 時代了,2.6.x 以下的版本徹底退出歷史舞台,技術變革太快了,趕緊學起來。。
Spring Boot 4.0.0 新特性
Spring Boot 4.0 無疑又是一次超神的版本,帶來了諸多重大升級,一起來看看。
1、最低環境要求
和 Spring Boot 3.0 保持一致,Spring Boot 4.0.0 最低要求也還是 Java 17,但最高支持的版本為 Java 25,Spring 也來到了全新的 Spring 7+。
Java 的目前最新版本為 Java 25:
我天,Java 25 發佈了。。炸裂!
對 Java 開發環境的要求對比表:
|
Spring Boot
|
JDK
|
Spring
|
Maven
|
Gradle
|
|
4.0.0
|
17 ~ 25
|
7.0.1+
|
3.6.3+
|
8.14+,9.x
|
|
3.5.0
|
17 ~ 24
|
6.2.7+
|
3.6.3+
|
7.6.4+,8.4+
|
|
3.4.0
|
16 ~ 23
|
6.2.0+
|
3.6.3+
|
7.6.4+,8.4+
|
|
3.3.0
|
17 ~ 22
|
6.1.8+
|
3.6.3+
|
7.5+,8.x
|
|
3.2.0
|
17 ~ 21
|
6.1.1+
|
3.6.3+
|
7.5+,8.x
|
|
3.1.0
|
17 ~ 20
|
6.0.9+
|
3.6.3+
|
7.5+,8.x
|
|
3.0.0
|
17 ~ 19
|
6.0.2+
|
3.5+
|
7.5+
|
|
2.7.18
|
8 ~ 21
|
5.3.31+
|
3.5+
|
6.8.x, 6.9.x, 7.x, 8.x
|
Spring Boot 4.0 嵌入式容器僅支持 Servlet 6.1+,Tomcat 11.0.x+ 和 Jetty 12.1.x,Undertow 已經移除支持了,我下面會説。
支持 Java 8 的最後一個 Spring Boot 2.x 系列版本早已已經退伍啦,Java 17 的新時代徹底到來。
如果你還停留在 Java 8 就 OUT 了,過去 2、3 年,Java 8 的採用率腰斬,Java 17+ 暴漲,新項目基本都是 Java 17+, Java 21+ 了。
2、Spring Boot 模塊化
Spring Boot 代碼庫徹底模塊化了,現在打包更小、更專注,用起來更清爽!
要知道,Spring Boot 1.0 於 2014 年發佈時,只有一個spring-boot-autoconfigurejar 文件,大小僅為 182 KB。
當然,最初的版本支持的功能並不多,但經過多年發展,Spring Boot 已經變得越來越臃腫了。到了 Spring Boot 3.5,這一個spring-boot-autoconfigurejar 包竟然達到了 2 MB!
因為 Spring 的最大優勢之一在於它支持的技術種類繁多,每支持一項新技術,自動配置的 jar 包自然就會增大。
Spring Boot 4 對自動配置的打包、交付和使用方式進行了根本性的變革,spring-boot-autoconfigure 不再使用單一的、龐大的 JAR 包,而是將功能拆分成更小、更專注的模塊。
這樣做的好處也相當顯著:
- 可維護性和架構清晰度:通過更小的模塊和強制執行的邊界,團隊和貢獻者可以更清晰地理解每個領域。
- 減少組件體積和佔用空間:你的應用現在只會拉取真正用到的模塊,而不是像以前那樣,一股腦兒地塞給你一個包含各種你可能根本用不上的功能的大型 autoconfigure jar 包。這樣一來,classpath 的開銷、啓動掃描的成本以及磁盤空間都能得到有效降低。
- 更強的信號和避免意外的自動配置:由於模塊是限定範圍的,所以 Spring Boot 能更清晰地判斷你引入依賴的原因,不需要調用
SpringApplication.setWebApplicationType(WebApplicationType.NONE)了。 - 新用例解鎖:模塊化已經開啓了很多新的用例,比如説,現在你可以獨立使用 Micrometer metrics,而無需依賴完整的 Actuator 包了,這在 Spring Boot 3.x 中是很難做到的。
比如,在 Spring Boot 3.x 時代是一個大管家,啓動器都會自動包含其相關的模塊,比如當 XX 包存在時,XX 就會自動配置。但在 Spring Boot 4 中,都已經模塊化了,需要自己引入 XX starter 以確保安裝了 spring-boot-xx 模塊才會生效。
3、API 版本控制
Spring 實現 API 版本控制一直是個痛點,官方並沒有提供內置支持,過去需要自己繞道實現,比如通過 HTTP 請求參數、自定義 HTTP Header 的方式來實現,非常複雜。
Spring 7.0 官方提供的 API 版本控制功能來了,Spring Boot 4.0 現在也對 API 版本控制提供了自動配置,同時支持 Spring MVC 和 Spring WebFlux。
現在 API 版本控制可以通過 spring.mvc.apiversion.* 或 spring.webflux.apiversion.* 屬性進行配置。一旦 API 版本控制啓用,你就可以開始映射帶版本的請求了。
註解 @RequestMapping version 屬性支持以下功能:
- 默認沒有值:匹配任何版本;
- 固定版本(比如 "1.2"):只匹配指定的這個版本;
- 基線版本(比如 "1.2+"):匹配指定的版本及更高版本。
如果多個 Controller 方法的版本都小於或等於請求版本,那麼會選擇版本最高且最接近請求版本的那個,其他的就直接被幹掉了。
我們來看看下面這些映射的例子:
@RestController
@RequestMapping("/account/{id}")
public class AccountController {
// 1、匹配任意版本
@GetMapping
public Account getAccount() {
}
// 2、匹配版本 1.1
@GetMapping(version = "1.1")
public Account getAccount1_1() {
}
// 3、匹配版本 1.2+
@GetMapping(version = "1.2+")
public Account getAccount1_2() {
}
// 4、匹配版本 1.5
@GetMapping(version = "1.5")
public Account getAccount1_5() {
}
}
我們來分析以下幾種不同版本的請求:
如果此時發送一個版本為 "1.3" 的請求?
只有 3、匹配版本 1.2+ 才匹配,因為它是最接近 1.3 的最高版本,1.5 的版本高於 1.3,所以不匹配。
如果此時發送一個版本為 "1.5" 的請求?
當然只有 4、匹配版本 1.5 精準匹配。
如果此時發送一個版本為 "1.6" 的請求?
此時,沒有一個版本可以匹配,這種情況下, NotAcceptableApiVersionException 會返回一個 400 錯誤。
這樣做是不是比傳統的實現方式要簡單、優雅多了?
如果想要更高級的控制,可以定義
ApiVersionResolver、ApiVersionParser和ApiVersionDeprecationHandler類型的 Bean。
4、HTTP Service Clients
Spring Boot 現在原生支持 HTTP 服務客户端的自動配置和配置屬性了,這玩意兒能讓你直接在普通的 Java 接口上加個註解,Spring 就能自動給你生成實現類,省心又省力!
如下面示例:
@HttpExchange(url = "https://echo.zuplo.io")
public interface EchoService {
@PostExchange
Map<?, ?> echo(@RequestBody Map<String, String> message);
}
使用 @HttpExchange 註解定義一個接口,使用 @PostExchange 來修飾方法,就能用來調用 Echo 服務,很神奇吧?
5、移除 Undertow
Spring Boot 4.0 已經移除了對 Undertow 嵌入式 Servlet 容器的支持:
Spring Boot 4.0+ 之後,嵌入式 Servlet 容器只支持 Tomcat 和 Jetty 了。
為什麼 Spring Boot 4.0 要移除 Undertow?
因為 Spring Boot 4.0+ 已經升級到了 Servlet 6.1+ 規範,但 Undertow 卻不支持 Servlet 6.1+,所以 Spring Boot 只能忍痛割愛,移除了對 Undertow 的支持。
更多解讀請參考這篇文章:
忍痛割愛,Spring Boot 宣佈移除 Undertow!!
6、其他
Spring Boot 4.0 還完成了以下幾件大事:
- 可觀測性增強,比如新增 OpenTelemetry starter,Redis 觀測從延遲記錄器切到 MicrometerTracing,SSL 和 MongoDB 的健康檢查邏輯也做了調整和擴展。
- 數據與基礎設施方面增加 Redis 靜態主從、MongoDB BigDecimal 存儲配置、JmsClient 支持,以及用於集成測試的 RestTestClient。
- 平台層面,大量 Spring 家族組件和 Tomcat、Hibernate、Kotlin、OpenTelemetry 等第三方庫統一升級到新主版本。
- 兼容性上,通過屬性重命名、收緊自動配置的對外 API 來規範邊界,同時 Jackson 2 的支持整體被標記為棄用,實際推薦遷移到 Jackson 3,這是升級時必須特別注意的一點。
- ……
本次升級的細節實在太多了,真的總結不過來,總之升級得注意了。
總結
Spring Boot 4.0 的發佈,標誌着 Java 應用開發邁入了一個全新的時代。
從模塊化的到來,再到 API 版本控制和 HTTP 客户端的內置支持,這一代 Spring Boot 不僅在技術架構上進行了深度革新,也大大提升了開發體驗與可維護性。
相比於 3.x 版本,Spring Boot 4.0 最大的亮點在於 “輕量化”和 “明確邊界”,模塊拆分讓項目更精簡、加載更快,也避免了不必要的自動配置。而 API 版本控制和 HTTP 客户端的原生支持,則彌補了長期以來開發者的痛點,使構建 RESTful 服務更加優雅和高效。
當然,隨之而來的挑戰也不少,Undertow 的移除、Jackson 3 的替代、自動配置規則的收緊,都要求開發者對項目依賴更加清晰可控,老舊項目的升級壓力不容忽視。
總的來説,Spring Boot 4.0 是一次顛覆式的升級,值得所有 Java 開發者認真學習與擁抱。
新的開發範式已經到來,你準備好了嗎?
話説你們現在用的什麼版本呢?
特別是對很多還停留在 Spring Boot 2.x 或 Java 8 的朋友來説,是時候認真考慮升級了,因為這些新功能不只是新,更意味着性能提升、安全增強、開發便捷、生態進化,而這正是我們做後端開發最核心關注的方向。
Spring Boot 實戰代碼已上傳 Github:
https://github.com/javastacks/spring-boot-best-practice