
首先來講,SpringBoot4是SpringBoot的大版本更新,說實話真的是更新的比較猛的,並且變化是非常大的,下面我們就來好好的捋一捋。
這是個什麼玩意?
Spring Boot 4.0是Spring Boot的一個重大的更新版本,距離Spring Boot 3.0已經過去了一段時間了,所以這次的更新並不是小打小鬧的,而是從底層上進行了大的改動,搞的跟重構一樣,下面我們就來看看。
先說個比較直觀的變化,就是最低的JDK版本要求直接是從JDK17起步了,並且官方推薦的JDK21這個版本,也就是說要是在項目中還在用JDK8或者是JDK11,那就根本用不了所以先要升級JDK的版本才能用Spring Boot 4.0。
其實這也是可以理解的,畢竟JDK17人家可是LTS版本,而且JDK21的虛擬線程技術確實是比較香的,雖然很多人可能對這東西不是特別的了解,但是推薦別墨跡了,趕緊升級試試慢慢開始學習么。
核心變化盤點
1、JDK版本要求
在前面的介紹中也說了,最低版本是JDK17,推薦版本是JDK21。這是為什麼呢?首先JDK21中有虛擬線程,這個虛擬線程太強了SpringBoot4.0的基礎就是從這裡入手的,這樣才能更好的支持百萬級的並發。當然如果在實際開發中還在用JDK1.8進行性能優化,那估計這就跟你沒啥關係了,作為一個開發者來講咱首先得跟得上時代發展的步伐呀,不能穩定的抱著老版本不放。
// 在 Spring Boot 4 中啟用虛擬線程的配置
// 這個配置在 application.yml 或者 application.properties 里寫
// spring.threads.virtual.enabled=true
@Configuration
public class VirtualThreadConfig {
// 配置虛擬線程執行器,這玩意兒能大幅提升並發性能
@Bean
public Executor virtualThreadExecutor() {
// 創建虛擬線程執行器,底層用的是 Java 21 的虛擬線程
// 虛擬線程比傳統線程輕量多了,一個線程池能支持百萬級並發
// 這玩意兒比傳統線程池強太多了,性能提升不是一點半點
return Executors.newVirtualThreadPerTaskExecutor();
}
}2、Spring Framework 7.0 集成
Spring Boot 4 基於Spring Framework 7.0進行了升級,這個也是Spring框架的一個大版本的更新。更新了包括如下的一些內容
- 聲明式 HTTP 客戶端(@HttpExchange)
- 更好的雲原生支持
- 響應式編程增強
- API 版本控制
這些更新的內容在實際使用場景中也是比較方便的特別是在HTTP的客戶端的訪問上,比之前的調用都簡單。如下所示。
// Spring Framework 7.0 引入的聲明式 HTTP 客戶端
// 這玩意兒比 RestTemplate 和 WebClient 用起來簡單多了,代碼量能減少 60%
@HttpExchange(url = "/api/users") // 定義基礎 URL,所有方法都基於這個路徑
public interface UserClient {
// 獲取用戶信息,方法簽名就是介面定義,不用寫實現;Spring 會自動生成代理
@GetExchange("/{id}") // GET 請求,路徑參數是 id
User getUser(@PathVariable Long id); // 返回 User 對象,自動反序列化
// 創建用戶,POST 請求,請求體是 User 對象;會自動序列化
@PostExchange
User createUser(@RequestBody User user);
}3、虛擬線程的支持
這個在前面的時候也提到了,這裡詳細來說說。虛擬機線程技術是JDK21引入的,Spring Boot4中對這個技術進行了深度的集成。對於傳統的線程一個線程對應一個操作線程,資源消耗較大;而虛擬線程是輕量級的線程,一個JVM的線程中可以運行成千上萬個虛擬線程。
這樣一看這個虛擬線程技術確實非常厲害呀,之前我們需要小心翼翼的來維護線程池技術,現在直接交給虛擬線程就完事了。
// 虛擬線程的實際應用場景
@Service
public class UserService {
// 這個方法如果用傳統線程,1000 個並發請求就得創建 1000 個線程;資源消耗太大了
// 用虛擬線程的話,可能只需要幾個 JVM 線程就能搞定;這就是差距
public CompletableFuture<User> fetchUserAsync(Long id) {
// 虛擬線程會自動管理,不需要手動創建線程池;Spring Boot 4 都幫你搞定了
return CompletableFuture.supplyAsync(() -> {
// 模擬資料庫查詢,這裡會掛起虛擬線程,不佔用操作系統線程
// 虛擬線程掛起時,JVM 線程可以去執行其他虛擬線程,利用率賊高
return userRepository.findById(id);
});
}
}4、雲原生的深度融合
Spring Boot4 在雲原生的場景下也是下了很大的功夫,特別是與Kubernetes的集成,支持了Kubernetes探針、自動伸縮、服務網格等都進行了適配。
# application.yml 中配置 Kubernetes 探針
spring:
application:
name: my-app
kubernetes:
probes:
liveness:
enabled: true # 啟用存活探針
path: /actuator/health/liveness # 探針路徑
readiness:
enabled: true # 啟用就緒探針
path: /actuator/health/readiness5、GraalVM原生鏡像支持
Spring Boot 4 對GraalVM原生鏡像的支持更加的完善。對於原生鏡像來講能夠大幅度的提升啟動的速度,減少了內存的佔用,特別是在雲原生場景中,在容器化部署的時候非常有用,啟動快、內存省,真的就是為雲原生量身定做的功能。
// 使用 GraalVM 編譯原生鏡像的配置
// 在 pom.xml 或者 build.gradle 中配置
// Maven 配置示例:
// <plugin>
// <groupId>org.springframework.boot</groupId>
// <artifactId>spring-boot-maven-plugin</artifactId>
// <configuration>
// <image>
// <builder>paketobuildpacks/builder:base</builder>
// </image>
// </configuration>
// </plugin>6、自動模塊推導
JDK 9中引入了模塊系統(JPMS)這個模塊一直是後續版本的痛點,在很多的第三方庫沒有module-info.java;
但是在Spring Boot 4中則是引入了自動模塊推導功能,能自動為這些庫生成模塊描述,解決90% 的模塊化兼容問題。
這功能確實實用,以前搞模塊化得一個個手動配置,現在自動搞定,省事多了。
7、分層編譯優化
Spring Boot 4 支持分層JAR操作,開發者可以將應用拆解為依賴層、資源層和業務層;
通過這種方式在容器鏡像中,可以做到依賴層的復用,這樣的話鏡像體積能減少 50%。
這功能對 Docker 鏡像優化特別有用,依賴層基本不變,只有業務層變化時才需要重新構建,構建速度也快了不少。
// 分層 JAR 的結構
// 依賴層:第三方庫,變化頻率低,可以復用
// 資源層:靜態資源,變化頻率中等
// 業務層:業務代碼,變化頻率高
// 這樣構建 Docker 鏡像時,只有業務層變化才需要重新構建
8、Jackson 3 支持
在Spring Boot 4中對Jackson 3進行了全面的支持,這也是為啥要指定最低版本的JDK的原因之一。通過對Jaskson3的全面支持提升了序列化的性能,同時還支持了一些新的數據格式,比如 CBOR;
在IoT場景中對於數據處理的需求較敏感的場景中特別有用,因為CBOR格式比JSON更緊湊,傳輸效率更高。
// Jackson 3 的新特性使用示例
@RestController
public class DataController {
@Autowired
private ObjectMapper objectMapper; // Spring Boot 4 自動配置的是 Jackson 3
@GetMapping("/data")
public String getData() throws JsonProcessingException {
// Jackson 3 的序列化性能比 Jackson 2 提升了 20% 左右
return objectMapper.writeValueAsString(data);
}
}
9、測試框架增強
在Spring Boot 4中還引入了RestTestClient,通過這個客戶端可以使得REST API的測試更加方便;同時對測試模塊也進行了升級,例如JUnit Jupiter 6.0,使得測試功能更加強大。
在這之前測試REST API得用MockMvc,寫起來比較麻煩,現在通過RestTestClient測試則是比較簡單了代碼減少了一半。
// RestTestClient 的使用示例
@SpringBootTest
class UserControllerTest {
@Autowired
private RestTestClient restTestClient; // 自動注入測試客戶端
@Test
void testGetUser() {
// 測試 GET 請求,比 MockMvc 用起來簡單
restTestClient.get()
.uri("/api/users/1")
.exchange()
.expectStatus().isOk()
.expectBody(User.class)
.value(user -> assertEquals("張三", user.getName()));
}
}
10、Spring AI 模塊集成
在AI時代,Spring Boot 4中直接內置了Spring AI模塊,我們可以方便地集成 AI 能力,比如調用大語言模型、向量資料庫等;
// Spring AI 的使用示例
@Service
public class AIService {
@Autowired
private ChatClient chatClient; // AI 聊天客戶端
public String chat(String prompt) {
// 調用 AI 模型,返迴響應
return chatClient.call(prompt);
}
}
升級注意事項
如果你要對自己的項目從Spring Boot 3升級到Spring Boot 4,需要注意下面幾點內容:
- JDK 版本必須升級:最低 Java 17,推薦 Java 21
- 依賴版本更新:很多第三方依賴可能需要升級到兼容 Spring Boot 4 的版本;這個比較麻煩,得一個個檢查
- 配置屬性變化:有些配置屬性可能被廢棄或改名,建議使用 spring-boot-properties-migrator 來檢查
- API 變化:部分 API 可能有變化,需要檢查代碼兼容性
所以對於升級的事情來講,還是需要在測試環境中穩定測試之後再上生產。
<!-- 添加屬性遷移工具,幫助檢查廢棄的屬性 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
性能提升
Spring Boot 4 在性能方面有不少提升:
- 啟動速度:使用 GraalVM 原生鏡像,啟動速度能提升 10 倍以上;
- 內存佔用:原生鏡像的內存佔用能減少 50% 以上;
- 並發性能:虛擬線程支持百萬級並發,比傳統線程池強太多;
- 序列化性能:Jackson 3 的序列化性能提升 20% 左右;
性能提升這塊確實給力,特別是原生鏡像和虛擬線程,這兩個特性加起來,性能提升不是一星半點的。
總結
Spring Boot 4 這次更新確實挺大的,從 JDK 版本要求到核心功能都有變化;如果需要升級,建議做好心理準備。可能得改不少代碼。但是升級帶來的性能提升和功能增強,還是挺值得的。
特別是虛擬線程和 GraalVM 原生鏡像這兩個特性,對性能提升幫助很大;如果你在做高並發應用或者雲原生應用,Spring Boot 4 絕對值得一試。
好了,今天就聊到這;下一篇咱詳細說說怎麼從 Spring Boot 3 升級到 4,包括具體的遷移步驟和注意事項。