新項目為什么決定用 Spring Boot 3.1 + JDK 17了
大家好,我是哪吒。
一、Spring Boot 3.1正式發布
經過半年的沉淀 Spring Boot 3.1于2023年5月18日正式發布了,帶來了許多令人興奮的新特性和改進。
本篇博客將詳細介紹Spring Boot 3.1的新特性、升級說明以及核心功能的改進。
同時,2.6.x 版本線已經停止維護了,最新支持版本如下圖所示:
最新支持版本
下圖時間軸展示了2.7.x 這也是目前唯一正在維護的 2.x 版本線了,商業支持的版本也只有 2.5.x 了。
商業支持的版本
二、最低環境要求
Spring Boot 3.1.0 需要Java 17,并且兼容 Java 20(包括 Java 20)。 還需要Spring Framework 6.0.9或更高版本。
1、為以下構建工具提供顯式構建支持:
2、Spring Boot 支持以下嵌入式 servlet 容器:
3、GraalVM本地鏡像:
可以使用 GraalVM 22.3 或更高版本將 Spring Boot 應用程序轉換為本機映像。
可以使用原生構建工具Gradle/Maven 插件或native-imageGraalVM 提供的工具來創建圖像。您還可以使用原生圖像 Paketo buildpack創建原生圖像。
4、支持以下版本:
三、核心特性
1、Apache HttpClient 4 的依賴管理
Spring Framework 6 中刪除了RestTemplate對Apache HttpClient 4 的支持,取而代之的是 Apache HttpClient 5。Spring Boot 3.0 包括 HttpClient 4 和 5 的依賴管理。繼續使用 HttpClient 4 的應用程序在使用時可能會遇到難以診斷的錯誤。Spring Boot 3.1 移除了 HttpClient 4 的依賴管理,以鼓勵用戶轉而使用 HttpClient 5。
HttpClient 5 是Apache HttpComponents中的一個 HTTP 客戶端庫,可以用來發送 HTTP 請求和接收 HTTP 響應。下面是 HttpClient 5 的簡單使用示例:
(1)添加 HttpClient 5 的依賴
在 Maven 項目中,可以通過在 pom.xml 文件中添加以下依賴將 HttpClient 5 添加到項目中:
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient5</artifactId>
<version>5.1</version>
</dependency>
</dependencies>
(2)創建 HttpClient 實例:
HttpClient httpClient = HttpClientBuilder.create().build();
(3)創建 HttpGet 請求:
HttpGet httpGet = new HttpGet("https://www.example.com/");
(4)發送請求并獲取響應:
HttpResponse response = httpClient.execute(httpGet);
(5)處理響應:
int statusCode = response.getStatusLine().getStatusCode();
String responseBody = EntityUtils.toString(response.getEntity());
其中,response.getStatusLine().getStatusCode() 可以獲取響應狀態碼,EntityUtils.toString(response.getEntity()) 可以獲取響應正文。
(6)完整的代碼如下:
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
HttpClient httpClient = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet("https://www.example.com/");
HttpResponse response = httpClient.execute(httpGet);
int statusCode = response.getStatusLine().getStatusCode();
String responseBody = EntityUtils.toString(response.getEntity());
System.out.println("Status code: " + statusCode);
System.out.println("Response body: " + responseBody);
}
}
2、Servlet 和過濾器注冊
ServletRegistrationBean如果注冊失敗,和類FilterRegistrationBean現在將失敗,IllegalStateException而不是記錄警告。如果您需要舊的行為,您應該調用setIgnoreRegistrationFailure(true)您的注冊 bean。
3、Git 提交 ID Maven 插件版本屬性
用于覆蓋 的版本的屬性io.github.git-commit-id:git-commit-id-maven-plugin已更新以與其工件名稱保持一致。為了適應這種變化,請git-commit-id-plugin.version在git-commit-id-maven-plugin.version您的pom.xml。
4、Hibernate 6.2
Spring Boot 3.1 升級到 Hibernate 6.2。請參閱Hibernate 6.2 遷移指南以了解這對您的應用程序有何影響。
Hibernate 6.2 遷移指南
5、Jackson 2.15
Spring Boot 3.1 升級到 Jackson 2.15。請參閱Jackson wiki以了解這對您的應用程序有何影響。
2.15 中的一個顯著變化是引入了處理限制。要調整這些約束,請定義Jackson2ObjectMapperBuilderCustomizer類似于以下內容:
@Bean
Jackson2ObjectMapperBuilderCustomizer customStreamReadConstraints() {
return (builder) -> builder.postConfigurer((objectMapper) -> objectMapper.getFactory()
.setStreamReadConstraints(StreamReadConstraints.builder().maxNestingDepth(2000).build()));
}
6、Mockito 5
Spring Boot 3.1 升級到 Mockito 5,特別是 5.3。請參閱 Mockito 發行說明以了解 Mockito 5.x 系列中的顯著變化。
7、Health Group Membership Validation
現在在啟動時驗證配置的健康組成員身份。如果包含或排除了不存在的健康指標,啟動將失敗。可以禁用此驗證,恢復早期版本的行為,方法是設置management.endpoint.health.validate-group-membership為false。
四、增強功能
1、服務連接
引入了新的服務連接概念。此類連接在應用程序中由 bean 表示ConnectionDetails。這些 bean 提供了必要的細節來建立與刪除服務的連接,并且 Spring Boot 的自動配置已更新為使用ConnectionDetailsbean。當此類 beans 可用時,它們將優先于任何與連接相關的配置屬性。與連接本身無關的配置屬性,例如控制連接池大小和行為的屬性,仍將被使用。
此低級功能旨在作為其他高級功能的構建塊,這些功能通過定義ConnectionDetailsbean 自動配置服務連接。
在沒有在其他地方定義適當的 bean 的情況下…ConnectionDetails,Spring Boot 的自動配置已更新為定義自己的基礎,由相關配置屬性支持。這允許…ConnectionDetails注入而不必處理沒有這樣的 bean 可用并且需要回退到基于屬性的配置的情況。
2、在開發時使用測試容器
引入了對在開發時使用測試容器管理外部服務的支持。
在開發時使用 Testcontainer 時,可以使用新的 Maven goal( spring-boot:test-run) 和 Gradle task( bootTestRun) 通過測試 main 方法啟動應用程序。
Container可以使用新注釋導入將 Testcontainers 實例聲明為靜態字段的類@ImportTestcontainers。
測試容器生命周期的管理得到改進,確保容器先初始化,最后銷毀。對可重復使用容器的支持也得到了改進。
從方法貢獻屬性Container @Bean,DynamicPropertyRegistry現在可以注入。@DynamicPropertySource這與您在測試中使用的方式類似。
有關詳細信息,請參閱下圖:
測試容器服務連接
使用 Testcontainers 時,@DynamicPropertySource通常用于根據容器的設置配置應用程序屬性:
@Container
static GenericContainer redis = new GenericContainer(DockerImageName.parse("redis").withTag("4.0.14"));
// …
@DynamicPropertySource
static void redisProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.redis.host", redis::getHost);
registry.add("spring.data.redis.port", redis::getFirstMappedPort);
}
現在可以簡化為以下內容:
@Container
@ServiceConnection
static GenericContainer redis = new GenericContainer(DockerImageName.parse("redis").withTag("4.0.14"));
此處,@ServiceConnection指示容器應使用 Redis 連接詳細信息的來源。spring-boot-testcontainers提供注釋的模塊將從@ServiceConnection容器中提取這些細節,同時仍然允許使用 Testcontainers API 來定義和配置它。
下圖查看注釋當前支持的服務的完整列表@ServiceConnection。
3、Docker Compose
一個新模塊,spring-boot-docker-compose提供與 Docker Compose 的集成。當您的應用程序啟動時,Docker Compose 集成將在當前工作目錄中查找配置文件。支持以下文件:
- compose.yaml
- compose.yml
- docker-compose.yaml
- docker-compose.yml
要使用非標準文件,請設置該spring.docker.compose.file屬性。
默認情況下,配置文件中聲明的服務將被啟動docker compose up,這些服務的連接詳細信息 bean 將被添加到應用程序上下文中,以便可以在沒有任何進一步配置的情況下使用這些服務。當應用程序停止時,服務將使用 關閉docker compose down。spring.docker.compose.lifecycle-management可以使用、spring.docker.compose.startup.command和配置屬性自定義此生命周期管理和用于啟動和關閉服務的命令spring.docker.compose.shutdown.command。
下圖展示更多詳細信息,包括當前支持的服務列表:
4、SSL 配置
RestTemplateJava KeyStore 和 PEM 編碼證書等 SSL 信任材料現在可以使用屬性進行配置,并WebClient以更一致的方式應用于各種類型的連接,例如嵌入式 Web 服務器、數據服務。
使用 PEM 編碼證書配置 SSL示例:
帶有前綴的配置屬性spring.ssl.bundle.pem可用于以 PEM 編碼文本的形式配置信任材料包。每個包都有一個用戶提供的名稱,可用于引用該包。
當用于保護嵌入式 Web 服務器時,akeystore通常配置有證書和私鑰,如本例所示:
spring:
ssl:
bundle:
pem:
mybundle:
keystore:
certificate: "classpath:application.crt"
private-key: "classpath:application.key"
當用于保護嵌入式 Web 服務器時,truststore通常使用服務器證書配置 a,如本例所示:
spring:
ssl:
bundle:
pem:
mybundle:
truststore:
certificate: "classpath:server.crt"
5、Spring授權服務器的自動配置
此版本提供了對Spring Authorization Server項目的支持以及一個新的spring-boot-starter-oauth2-authorization-server啟動器。
示例:
如果您spring-security-oauth2-authorization-server的類路徑上有,您可以利用一些自動配置來設置基于 Servlet 的 OAuth2 授權服務器。
您可以在spring.security.oauth2.authorizationserver.client前綴下注冊多個 OAuth2 客戶端,如以下示例所示:
spring:
security:
oauth2:
authorizationserver:
client:
my-client-1:
registration:
client-id: "abcd"
client-secret: "{noop}secret1"
client-authentication-methods:
- "client_secret_basic"
authorization-grant-types:
- "authorization_code"
- "refresh_token"
redirect-uris:
- "https://my-client-1.com/login/oauth2/code/abcd"
- "https://my-client-1.com/authorized"
scopes:
- "openid"
- "profile"
- "email"
- "phone"
- "address"
require-authorization-consent: true
my-client-2:
registration:
client-id: "efgh"
client-secret: "{noop}secret2"
client-authentication-methods:
- "client_secret_jwt"
authorization-grant-types:
- "client_credentials"
scopes:
- "user.read"
- "user.write"
jwk-set-uri: "https://my-client-2.com/jwks"
token-endpoint-authentication-signing-algorithm: "RS256"
Spring Boot 為 Spring Authorization Server 提供的自動配置,就是為了快速上手而設計的。大多數應用程序都需要定制,并希望定義幾個 bean 來覆蓋自動配置。
以下組件可以定義為 beans 以覆蓋特定于 Spring Authorization Server 的自動配置:
- RegisteredClientRepository
- AuthorizationServerSettings
- SecurityFilterChain
- com.nimbusds.jose.jwk.source.JWKSource<com.nimbusds.jose.proc.SecurityContext>
- JwtDecoder
6、Docker鏡像構建
(1)圖像創建日期和時間
Mavenspring-boot:build-image目標和bootBuildImageGradle 任務現在有一個createdDate配置選項,可用于將Created生成的圖像元數據中的字段值設置為用戶指定的日期或使用now當前日期和時間。
(2)圖像應用目錄
Mavenspring-boot:build-image目標和bootBuildImageGradle 任務現在有一個applicationDirectory配置選項,可用于設置構建器映像中的位置,應用程序內容將上傳到該位置以供構建包使用。這也將是應用程序內容在生成的圖像中的位置。
五、用于 GraphQL 的 Spring
1、異常處理
@GraphQlExceptionHandler在控制器中聲明的方法,或者@ControllerAdvice現在由 Spring for GraphQL 開箱即用地支持控制器方法調用。此外,Spring Boot通過@ControllerAdvice配置DataFetcher、QueryDslDataFetcher、QueryByExampleDataFetcher、GraphQlSource。
2、分頁和排序
當 Spring Data 在類路徑上時,GraphQL 的 Spring 現在自動配置為支持分頁和排序。
3、改進的模式類型生成
GraphQlSource現在自動配置了一個ConnectionTypeDefinitionConfigurer. 它通過查找類型定義名稱以“Connection”結尾的字段來生成“Connection”類型Connection Type,如果它們尚不存在,則添加所需的類型定義。
4、支持使用 OTLP 導出跟蹤
當io.opentelemetry:opentelemetry-exporter-otlp在類路徑上時,OtlpHttpSpanExporter將自動配置。可以使用management.otlp.tracing.*配置屬性自定義導出器的配置。
5、Wavefront Span 標簽定制
如果您正在使用 Wavefront 并且想要為 RED 指標自定義 span 標簽,現在有一個名為的新屬性management.wavefront.trace-derived-custom-tag-keys允許您執行此操作。
6、文件和控制臺的不同日志級別
如果您使用的是 Logback 或 Log4j2,現在可以選擇為控制臺日志和文件日志設置不同的日志級別。這可以使用配置屬性logging.threshold.console和來設置logging.threshold.file。
7、最大 HTTP 響應標頭大小
如果您使用的是 Tomcat 或 Jetty,您現在可以限制最大 HTTP 響應標頭大小。對于 Tomcat,您可以使用該server.tomcat.max-http-response-header-size屬性,而對于 Jetty,您可以使用server.jetty.max-http-response-header-size. 默認情況下,響應標頭僅限于8kb。
六、spring Boot 3.1 中的棄用
已棄用 | 取而代之 |
spring.kafka.streams.cache-max-size-buffering | spring.kafka.streams.state-store-cache-max-size |
MongoPropertiesClientSettingsBuilderCustomizer | StandardMongoClientSettingsBuilderCustomizer |
org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesRegistrationAdapter | org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesMapper |
org.springframework.boot.web.server.SslStoreProvider | SSL bundle |
七、依賴升級
Spring Boot 3.1.0 遷移到幾個 Spring 項目的新版本:
Spring項目 | Versions |
Spring Authorization Server | 1.1.0 |
Spring Batch | 5.0.2 |
Spring Data | 2023.0.0 |
Spring Framework | 6.0.9 |
Spring GraphQL | 1.2.0 |
Spring HATEOAS | 2.1.0 |
Spring Integration | 6.1.0 |
Spring Kafka | 3.0.7 |
Spring LDAP | 3.1.0 |
Spring Security | 6.1.0 |
Spring Session | 3.1.0 |
Spring Web Services | 4.0.4 |
許多第三方依賴項也已更新,其中一些更值得注意的是:
第三方依賴 | Versions |
Couchbase Java Client | 3.4.6 |
Elasticsearch Client | 8.7 |
Hibernate | 6.2 |
GraphQL Java | 20.1 |
Jackson | 2.15.0 |
Kafka | 3.4.0 |
Kotlin | 1.8.21 |
Liquibase | 4.20 |
Micrometer | 1.11.0 |
Micrometer Tracing | 1.1.1 |
Mockito | 5.3 |
Native Build Tools | 0.9.22 |
Neo4j Java Driver | 5.8.0 |
OpenTelemetry | 1.24.0 |
Rabbit AMQP Client | 5.17.0 |
Reactor BOM | 2022.0.7 |
Testcontainers | 1.18 |
Undertow | 2.3.6.Final |
八、其他
- Spring Kafka ContainerCustomizer bean現在被應用于自動配置的KafkaListenerContainerFactory。
- 添加了management.otlp.metrics.export.headers屬性,以支持向OTLP注冊表發送頭。
- JoranConfigurators bean現在可以在AOT處理中使用。
- spring.kafka.admin添加了額外的close-timeout、operation-timeout、auto-startup和auto-create屬性。
- BatchInterceptor bean現在被應用于自動配置的ConcurrentKafkaListenerContainerFactory。
- Nomad已添加到已識別的CloudPlaform值列表中。
- 現在可以為spring.jmx指定registration-policy屬性。
- 添加了withSanitizedValue實用方法到SanitizableData中。
- 引入了RabbitTemplateCustomizer。這種類型的bean將自定義自動配置的RabbitTemplate。
- 支持CNB Platform API 0.11。
- spring-boot-starter-parent將Maven編譯器版本設置為配置的Java版本。
- 通過設置-Dspring-boot.build-info.skip,現在可以跳過build-info目標。
- Micrometer的OtlpMeterRegistry支持聚合時間配置。
- Log4j2和Logback支持更多顏色。
- 添加了對R2DBC MySQL驅動程序(io.asyncer:r2dbc-mysql)的依賴管理。
- 添加了對R2DBC MariaDB驅動程序(org.mariadb:r2dbc-mariadb)的依賴管理。
- 使用OpenTelemetry時,用于創建自動配置的SdkTracerProvider的SdkTracerProviderBuilder可以通過定義SdkTracerProviderBuilderCustomizer bean進行自定義。
- MockServerRestTemplateCustomizer現在通過新的setBufferContent方法支持啟用內容緩沖
- 當自動配置Spring Batch時,可以通過定義BatchConversionServiceCustomizer bean來自定義轉換服務。
- 用于創建JWK Set URI的JTW解碼器的構建器可以通過定義JwkSetUriReactiveJwtDecoderBuilderCustomizer或JwkSetUriJwtDecoderBuilderCustomizer bean進行自定義。
- 恢復了對io.r2dbc:r2dbc-mssql的依賴管理。
- Logback的根日志級別現在盡早默認為INFO。
- 默認情況下,Docker Compose現在使用stop而不是down停止。
本文轉載自微信公眾號「哪吒編程」,可以通過以下二維碼關注。轉載本文請聯系哪吒編程公眾號。