重磅發布!Spring Boot 3.5 十大新特性全面解析,開發體驗再進化!
隨著 Spring Boot 3.5 的正式發布,開發體驗再次升級!本次版本不僅修復了大量問題,更在配置一致性、日志可控性、異步處理、環境變量支持等方面進行了大刀闊斧的改進。本文將帶你深入了解 Spring Boot 3.5 中最值得關注的 11 個新特性,每一項都是開發實戰中可能用到的關鍵能力。
enabled 屬性行為統一:徹底告別“真真假假”
Spring Boot 對 .enabled 配置項的解析邏輯進行了嚴格規范。以往只要不是明確寫為 false,很多配置都默認啟用,造成行為不一致?,F在,.enabled 只接受嚴格的布爾值:true 或 false。這一變化提升了配置的可預期性,也避免了誤配置導致功能誤觸發的情況。
TaskExecutor 默認命名統一:只保留 applicationTaskExecutor
之前版本默認注入了兩個名字不同但本質相同的 TaskExecutor(taskExecutor 和 applicationTaskExecutor),容易引起混淆。Spring Boot 3.5 中僅保留 applicationTaskExecutor。
提示:若你原有代碼依賴 taskExecutor 命名,推薦通過 BeanFactoryPostProcessor 添加別名進行兼容。
@Configuration
public class AppConfig {
@Bean
static BeanFactoryPostProcessor aliasProcessor() {
return (beanFactory) -> beanFactory.registerAlias("applicationTaskExecutor", "taskExecutor");
}
}
Redis 配置行為更清晰:URL 優先,忽略 database 字段
當你在配置中指定了 spring.data.redis.url(比如 redis://user:pwd@host:6379/8),Redis 數據庫編號將只由 URL 決定,spring.data.redis.database 屬性將被忽略。這種方式與 Redis 的連接字符串語義更一致。
spring:
data:
redis:
url: redis://user:password@host:6379/8
database: 2 # 被忽略
新增注解式 Filter 和 Servlet 注冊方式
以往需要借助 FilterRegistrationBean 或 ServletRegistrationBean 來注冊 Web 組件,現在可以使用新的注解方式:
@Bean
@FilterRegistration(name = "myFilter", urlPatterns = "/api/*", order = 1)
public MyFilter myFilter() {
return new MyFilter();
}
這種聲明方式更清爽,減少了 XML 和 Bean 配置的繁瑣程度。
支持從單個環境變量加載多個配置項
你可以在系統環境變量中用多行內容一次性設置多個配置項,再通過 application.yml 中的 spring.config.import 引入:
示例:使用 PowerShell 設置
$appsetting = @"
pack.title=PackApp
pack.version=1.0.0
"@
[System.Environment]::SetEnvironmentVariable("APP_PACK", $appsetting, "User")
spring:
config:
import:
- env:APP_PACK
@Component
public class EnvProperties implements CommandLineRunner {
@Value("${pack.title}")
private String title;
@Value("${pack.version}")
private String version;
@Override
public void run(String... args) {
System.out.printf("title = %s, version = %s%n", title, version);
}
}
運行輸出:
title = PackApp, version = 1.0.0
可自定義結構化日志堆棧輸出
結構化日志堆棧信息現在可自定義輸出格式、長度、堆棧深度等:
logging:
structured:
json:
stacktrace:
root: first
max-length: 2000
include-hashes: true
可設置:
配置項 | 說明 |
| 異常根項位置: |
| 日志堆棧最大字符數 |
| 是否輸出堆棧條目的哈希 |
WebClient 支持全局連接設置
在響應式 Web 開發中常用的 WebClient 現在可以通過配置項直接設置連接器(如 Jetty)、超時時間等參數:
spring:
http:
reactiveclient:
settings:
connector: jetty
connect-timeout: 2s
read-timeout: 1s
redirects: dont-follow
這極大簡化了網絡通信的全局配置方式。
自動任務調度支持 TaskDecorator 裝飾器
TaskScheduler 支持使用自定義 TaskDecorator,可在執行任務前后添加邏輯,例如日志、上下文傳遞、鏈路追蹤等:
@Configuration
@EnableScheduling
public class TaskConfig {
@Bean
public TaskDecorator taskDecorator() {
return runnable -> () -> {
System.out.println("任務執行前裝飾");
runnable.run();
};
}
}
強制使用自動配置的 Executor
在設置:
spring:
task:
execution:
mode: force
之后,Spring Boot 會強制使用自動配置的 AsyncTaskExecutor,即使你已經提供了自定義 Executor bean。這能保證 @Async 注解和框架內部的異步任務行為一致。
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean
public Executor executor() {
return new ThreadPoolExecutor(5, 5, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100),
r -> new Thread(r, "async-thread"));
}
}
自動創建 bootstrapExecutor Bean 支持后臺初始化
Spring Boot 現在會根據需要自動配置 bootstrapExecutor Bean,用于在后臺異步初始化其他 Bean,例如耗時較長的資源加載。
@Bean(bootstrap = Bootstrap.BACKGROUND)
public Person person() {
System.out.printf("%s - 創建 Person 實例%n", Thread.currentThread().getName());
return new Person();
}
這有助于縮短應用啟動時長,提升啟動性能體驗。
Actuator 的 heapdump 端點默認禁用
為防止敏感信息泄露,Spring Boot 3.5 默認將 heapdump 端點的訪問權限設為 access=NONE。若要啟用此功能,需顯式設置訪問級別并暴露端點:
management:
endpoints:
web:
exposure:
include: heapdump
endpoint:
heapdump:
enabled: true
總結
Spring Boot 3.5 的這一輪更新,在保持穩定性的基礎上,顯著提升了:
- 配置一致性和可控性;
- 異步任務執行的靈活性;
- 日志系統的結構化和安全性;
- 環境變量和資源初始化的便捷性;
- 網絡通信的配置簡潔性。
可以說,每一項改進都切中了實際開發的痛點。
如果你正打算升級 Spring Boot,3.5 版本無疑值得一試!