這可能是最全的SpringBoot3新版本變化了!

艾小仙發表於2022-11-28

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 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 包的最新穩定版本,其中一些值得注意的依賴升級包括:

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 就可以建立 metricstrace,新版本 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,將會自動裝配SpanContextSupplierSpanContextSupplier將會把 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-modemanual 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註解,但是需要將@SpringBootTestuseMainMethod屬性設定為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-patternspring.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 時,RabbitStreamTemplateEnvironment 現在將自動裝配,無論 spring.rabbitmq.listener.type 是否是 stream
  • 已有的 Kafka 主題可以使用 spring.kafka.admin.modify-topic-configs 進行修改。
  • WebDriverScopeWebDriverTestExectionListener 現在是 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 上的無參建構函式已被棄用。
  • DefaultTestExecutionListenersPostProcessorSpringBootDependencyInjectionTestExecutionListener 已被棄用,轉而使用 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...,如有錯誤,請指出,謝謝。

相關文章