重磅!SpringBoot4發布,11項重大變更全解析!
不知道大家最近沒有發現?在我們新創建 Spring Boot 項目的時候,已經有了 Spring Boot 4.0.0 預覽版這個選項了,如下圖所示:
圖片
并且 Spring Boot 4 底層是基于全新的 Spring Framework 7.0.0 實現的,如下圖所示:
圖片
那么問題來了,新版本都有哪些重要的變更呢?接下來由磊哥帶著大家搶先來看。
1.優雅版本控制
新版本引入了優雅的 API 版本控制支持,允許開發者通過 @RequestMapping 注解中的 version 參數來實現版本控制,如下代碼所示:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
publicclass VersionedController {
@RequestMapping(value = "/user", version = "1")
public String getUserV1() {
// 版本1實現
System.out.println("Version 1");
return"Version 1";
}
@RequestMapping(value = "/user", version = "2")
public String getUserV2() {
// 版本2實現
System.out.println("Version 2");
return"Version 2";
}
}
程序執行效果:
圖片
2.方便的Bean注入
新版本引入了新的 BeanRegistrar 合約,允許更靈活地注冊 Bean(一次性注入多個 Bean),示例代碼如下:
import org.springframework.beans.factory.BeanRegistrar;
import org.springframework.beans.factory.BeanRegistry;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.Environment;
@Configuration
@Import(MyBeansRegistrar.class)
public class MyConfiguration {
}
class MyBeansRegistrar implements BeanRegistrar {
@Override
public void register(BeanRegistry registry,
Environment env) {
registry.registerBean("user", User.class);
if (env.matchesProfiles("dev")) {
registry.registerBean(Order.class, spec -> spec
.supplier(context -> new Order("order_001")));
}
}
}
class User {
private String name;
}
class Order {
public Order(String name) {
this.name = name;
}
private String name;
}
寫一個單元測試證明注冊的 Bean 是可以正常使用的:
圖片
3.Null安全改進
新版本采用 JSpecify 注解來聲明 API 的空值安全性,使用 @Nullable 表示可為 Null,使用 @NonNull 表示不能為空,并且會通過 Idea 配合提示警告或錯誤信息,例如以下代碼:
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
publicclass Person {
private String name;
public void setName(@NonNull String name) {
this.name = name;
}
@Nullable
public String getName() {
returnthis.name;
}
}
在 Idea 中也能看到警告信息:
圖片
不同 Idea 版本展現形式不一樣,博主使用的是 Idea 2024,新版本應該才會支持新特性。
4.HTTP代理輕松創建
新版本提供了 @ImportHttpServices 注解,讓你為 HTTP 接口創建代理更加容易,示例代碼如下(它允許您輕松聲明、檢測和配置整個 HTTP 服務組):
@Configuration(proxyBeanMethods = false)
@ImportHttpServices(group = "weather", types = {FreeWeather.class, CommercialWeather.class})
@ImportHttpServices(group = "user", types = {UserServiceInternal.class, UserServiceOfficial.class})
static class HttpServicesConfiguration extends AbstractHttpServiceRegistrar {
@Bean
public RestClientHttpServiceGroupConfigurer groupConfigurer() {
return groups -> groups.filterByName("weather", "user")
.configureClient((group, builder) -> builder.defaultHeader("User-Agent", "My-Application"));
}
}
5.其他七個變更
其他升級的特性還包括:
- SPEL 表達式升級:SPEL 表達式中支持空安全和 Elvis 運算符,例如以下代碼:
@Value("#{systemProperties['pop3.port'] ?: 25}")
它表示,將注入系統屬性 pop3.port 的值,如果未定義該屬性值,注入 25 這個值。
- GraalVM 原生應用支持:借助 Spring AOT 技術,將應用編譯成原生鏡像,極大地縮短了啟動時間。
- 支持 Jackson 3.x:放棄對 Jackson 2.x 的支持,升級為 Jackson 3.x。
- Servlet 和 WebSocket 版本升級:使用 Servlet 6.1 和 WebSocket 2.2 作為 Web 應用程序的底層實現,這意味著應用程序應該部署在最新的 Servlet 容器上,比如 Tomcat 11+ 和 Jetty 12.1+。
- HttpHeaders 優化:HttpHeaders 操作如下:
@RestController
publicclass MyController {
@GetMapping("/headers")
public ResponseEntity<String> handleRequest(HttpHeaders headers) {
// 舊方式(已廢棄)
// headers.getFirst("X-Custom-Header");
// 新方式
String value = headers.firstValue("X-Custom-Header").orElse(null);
// 遍歷所有頭部
headers.forEach((name, values) -> {
System.out.println(name + ": " + values);
});
return ResponseEntity.ok("Processed");
}
}
- 功能刪除:新版本中的刪除的內容如下:
Spring MVC 的 XML 配置名稱空間現在被棄用,取而代之的是 Java 配置體。
Spring TestContext 框架中的 JUnit 4 支持現在已經被棄用。
Jackson 2.x 支持已被棄用,取而代之的是 Jackson 3.x。
Spring JCL 停用。
- 最低環境要求提高:
Jakarta EE 11 (Tomcat 11+)
Kotlin 2.x
JSONassert 2.0
GraalVM 23
更多升級信息參考官網:https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-7.0-Release-Notes
小結
程序員是干到老學到老的行業,框架和工具的變更意味著我們會有更便利、更友好的調用方式,所以對于程序員是利好的,因此一起學起來、用起來、折騰起來吧。