11月24號,Spring Boot 3.0 釋出了第一個正式的 GA 版本,一起看看新版本到底有哪些變化。
2.7版本升級指南
官方提供了一個從 2.7 版本升級到 3.0 的指南:https://github.com/spring-pro...,官方建議在升級到 Spring Boot 3.0 之前先升級到 Spring Boot 2.7。
新的變化
基於Java17和支援Java19
Spring Boot 3.0 使用 Java 17作為最低版本,如果你目前使用的是 Java 8或 Java 11,那麼需要升級先升級 JDK,並且新版本已透過 JDK 19 進行了測試。
GraalVM支援
Spring Native 也是升級的一個重大特性,支援使用 GraalVM 將 Spring 的應用程式編譯成本地可執行的映象檔案,可以顯著提升啟動速度、峰值效能以及減少記憶體使用。
關於 GraalVM 使用可以參考:https://docs.spring.io/spring...
三方包升級
Spring Boot 3.0 構建基於 Spring Framework 6 之上,需要使用 Spring Framework 6。
該版本中升級的其他 Spring 專案包括:
- Spring AMQP 3.0.
- Spring Batch 5.0.
- Spring Data 2022.0-Release-Notes).
- Spring GraphQL 1.1.
- Spring HATEOAS 2.0.
- Spring Integration 6.0.
- Spring Kafka 3.0.
- Spring LDAP 3.0.
- Spring REST Docs 3.0.
- Spring Retry 2.0.
- Spring Security 6.0
- Spring Session 2022.0
- Spring WS 4.0.
Spring Boot 3.0 已經從 Java EE
升級為 JakartaEE API
。儘可能選擇 JakartaEE10
相容的依賴:
- Jakarta Activation 2.1
- Jakarta JMS 3.1
- Jakarta JSON 2.1
- Jakarta JSON Bind 3.0
- Jakarta Mail 2.1
- Jakarta Persistence 3.1
- Jakarta Servlet 6.0
- Jakarta Servlet JSP JSTL 3.0
- Jakarta Transaction 2.0
- Jakarta Validation 3.0
- Jakarta WebSocket 2.1
- Jakarta WS RS 3.1
- Jakarta XML SOAP 3.0
- Jakarta XML WS 4.0
另外,還升級了第三方 jar 包的最新穩定版本,其中一些值得注意的依賴升級包括:
- Couchbase Client 3.4
- Elasticsearch Client 8.5
- Flyway 9
- Groovy 4.0
- Hibernate 6.1
- Hibernate Validator 8.0
- Jackson 2.14
- Jersey 3.1
- Jetty 11
- jOOQ 3.16
- Kotlin 1.7.20
- Liquibase 4.13
- Lettuce 6.2
- Log4j 2.18
- Logback 1.4
- Micrometer 1.10
- Micrometer Tracing 1.0
- Neo4j Java Driver 5.2
- Netty 4.1.77.Final
- OkHttp 4.10
- R2DBC 1.0
- Reactor 2022.0
- SLF4J 2.0
- SnakeYAML 1.32
- Tomcat 10
- Thymeleaf 3.1.0.M2
- Undertow 2.2.20.Final
Log4j2增強
這次升級,包含了一些對 Log4j2 的擴充套件支援,具體如下,也可以參考官方文件:https://docs.spring.io/spring...。
配置檔案增強
比如下面針對不同環境的配置方式。
<SpringProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</SpringProfile>
<SpringProfile name="dev | staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</SpringProfile>
<SpringProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</SpringProfile>
Spring 環境屬性增強
支援在 Log4j2配置中引用 Spring 環境中的屬性,使用 Spring:
字首。
<Properties>
<Property name="applicationName">${spring:spring.application.name}</property>
</Properties>
系統屬性增強
Log4j2現在支援更多可配置的 System.properties
。比如,可以使用 log4j2.skipJansi
系統屬性來配置 Console Appender
是否在 Windows 上使用 Jansi
輸出流。
在 Log4j2 初始化之後載入的所有System.properties
都可以從 SpringEnvironment
拿到。比如上面的舉例一樣,可以把log4j2.skipJansi = false
配置到 application.properties
中。
@ConstructorBinding檢測最佳化
以前如果希望屬性繫結到類中,我們透過使用@ConfigurationProperties
和@ConstructorBinding
註解可以做到。
新版本針對該註解做了最佳化,當使用建構函式繫結@ConfigurationProperties
時,如果類只有一個引數的建構函式,則不再需要@ConstructorBinding
註解。
如果有多個建構函式,那麼仍然需要使用@ConstructorBinding
來告訴 Spring Boot 應該使用哪個建構函式。
Micrometer 升級
Spring Boot 3.0 支援 Micrometer 1.10 中引入的新的 Observation API,新的 ObservationRegistry
提供一個 API 就可以建立 metrics
和 trace
,新版本 SpringBoot 現在將會自動裝配ObservationRegistry
,並且可以使用ObservationRegistryCustomizer
進一步定製化ObservationRegistry
。
可以參考官方文件:https://docs.spring.io/spring...
Micrometer Tracing 自動裝配
SpringBoot 現在自動裝配Micrometer Tracing ,包括對 Brave, OpenTelemetry, Zipkin 和 Wavefron 的支援。
另外,當引入io.micrometer:micrometer-registry-otlp
包之後, OtlpMeterRegistry
也會自動裝配。
細節參考官方文件:https://docs.spring.io/spring...
Prometheus 支援
如果存在 Prometheus 依賴和 Tracer
Bean,將會自動裝配SpanContextSupplier
,SpanContextSupplier
將會把 metrics 關聯到 trace,因為它會把當前的 traceID 和 spanID 儲存到 Prometheus 的 Example 中。
更靈活的Spring Data JDBC裝配
Spring Data JDBC的自動裝配現在更加靈活,Spring Data JDBC 所需的幾個自動裝配的 Bean
現在是有條件的,可以透過定義相同型別的Bean來替換,可以替換的Bean
型別如下:
org.springframework.data.jdbc.core.JdbcAggregateTemplate
org.springframework.data.jdbc.core.convert.DataAccessStrategy
org.springframework.data.jdbc.core.convert.JdbcConverter
org.springframework.data.jdbc.core.convert.JdbcCustomConversions
org.springframework.data.jdbc.core.mapping.JdbcMappingContext
org.springframework.data.relational.RelationalManagedTypes
org.springframework.data.relational.core.dialect.Dialect
Kafka非同步ACK支援
現在可以透過設定spring.kafka.listener.async-acks=true
來開啟 Kafka 的非同步 ACK,並且需要設定spring.kafka.listener.async-mode
為manual
or manual-immediate
。
新的Elasticsearch JAVA客戶端支援
支援新版本的 ES JAVA 客戶端自動裝配,可以透過屬性spring.elasticsearch.*
來配置。
JdkClientHttpConnector 自動裝配
如果沒有 Netty Reactor、Jetty reactive client 和 Apache HTTP client ,將自動裝配JdkClientHttpConnector
,這允許WebClient
和 JDK 的HttpClient
一起使用。
@SpringBootTest最佳化升級
現在任何@SpringBootConfiguration
中的main
方法都可以使用@SpringBootTest
註解,但是需要將@SpringBootTest
的useMainMethod
屬性設定為UseMainMethod.ALWAYS
或者UseMainMethod.WHEN_AVAILABLE
。
雜七雜八
除了上面列出的改變之外,還有一些小的調整和最佳化,包括:
- 在應用程式啟動時候不再記錄Host Name,可以提高啟動速度,縮短網路查詢的耗時
- 移除了對 SecurityManager 的支援。
- 在
Spring Framework6
中移除CommonsMultipartResolver
之後,對它的支援也被移除了。 - 為了保持和 Spring6 版本一致,不再推薦使用
spring.mvc.ignore-default-model-on-redirect
- Web Jar 資源處理器 path pattern 可以使用引數
spring.mvc.webjars-path-pattern
、spring.webflux.webjars-path-pattern
自定義 - Tomcat 遠端 IP 閥的可信代理可以使用
server.Tomcat.Remoteip.trust-proxy
配置。 - 可以透過定義
ValidationConfigurationCustomizer
來自定義 Bean 的校驗。 - Log4j2的
Log4jBridgeHandler
現在用於將基於 JUL 的日誌路由到 Log4j2,而不是透過 SLF4J 路由。 - 實現
MeterBinder
介面的 Bean 現在只有在所有單例 Bean 初始化之後才繫結到meter registries。 - 用於 Brave 和 OpenTelemetry 的
SpanCustomizer
bean 現在會自動裝配 - Micrometer 的
JvmCompilationMetrics
現在會自動裝配。 DiskSpaceHealthIndicator
現在其日誌訊息中包含路徑及其健康詳細資訊。- 現在可以從包裝的 DataSource 派生
DataSourceBuilder
。 - 現在可以使用
spring.data.mongodb.additional-hosts
屬性為 MongoDB 配置多個 host。 - 可以使用
spring.elasticsearch.socket-keep-alive
屬性配置 Elasticsearch 的 socketKeepAlive 屬性。 - 在使用
spring-rabbit-stream
時,RabbitStreamTemplate
和Environment
現在將自動裝配,無論spring.rabbitmq.listener.type
是否是stream
。 - 已有的 Kafka 主題可以使用
spring.kafka.admin.modify-topic-configs
進行修改。 WebDriverScope
和WebDriverTestExectionListener
現在是 public,以方便在自定義測試配置中使用WebDriver
。
棄用功能
ConstructorBinding
已經從org.springframework.boot.context.properties
包修改為org.springframework.boot.context.properties.bind
。- 已不推薦使用基於
JsonMixinModule
掃描的建構函式。 ClientHttpRequestFactorySupplier
應該替換為ClientHttpRequestFactories
。- 不再支援 Cookie 註釋屬性。
RestTemplateExchangeTagsProvider
,WebClientExchangeTagsProvider
,WebFluxTagsProvider
,WebMvcTagsProvider
和相關類已經被ObservationConvention
所取代。HealthContributor
@Configuration 上的無參建構函式已被棄用。DefaultTestExecutionListenersPostProcessor
和SpringBootDependencyInjectionTestExecutionListener
已被棄用,轉而使用 Spring 框架的ApplicationContextFailureProcessor
。- 不推薦使用
management.metrics.export.<product>
,推薦使用management.<product>.metrics.export
。 management.prometheus.metrics.export.pushgateway.shutdown-operation
支援 POST@AutoConfigureMetrics
已被棄用,推薦使用@AutoConfigureObservability
。
大部分內容翻譯、修改自官方Release Notes:https://github.com/spring-pro...,如有錯誤,請指出,謝謝。