一、介绍
1.1 新特性概述
经过半年的沉淀 Spring Boot 3.1于2023年5月18日正式发布了,带来了许多令人兴奋的新特性和改进。本篇博客将详细介绍Spring Boot 3.1的新特性、升级说明以及核心功能的改进。
同时,2.6.x 版本线已经停止维护了,最新支持版本如下图所示:
下图时间轴展示了2.7.x 这也是目前唯一正在维护的 2.x 版本线了,商业支持的版本也只有 2.5.x 了。
1.2 最低环境要求
Spring Boot 3.1.0 需要Java 17,并且兼容 Java 20(包括 Java 20)。 还需要Spring Framework 6.0.9或更高版本。
为以下构建工具提供显式构建支持:
Spring Boot 支持以下嵌入式 servlet 容器:
GraalVM本地镜像:
可以使用 GraalVM 22.3 或更高版本将 Spring Boot 应用程序转换为本机映像。
可以使用原生构建工具Gradle/Maven 插件或
native-image
GraalVM 提供的工具来创建图像。您还可以使用原生图像 Paketo buildpack创建原生图像。
支持以下版本:
二、核心特性
2.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 的简单使用示例:
🌟添加 HttpClient 5 的依赖
在 Maven 项目中,可以通过在 pom.xml 文件中添加以下依赖将 HttpClient 5 添加到项目中:
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient5</artifactId>
<version>5.1</version>
</dependency>
</dependencies>
🌟创建 HttpClient 实例
可以通过以下方式创建 HttpClient 实例:
HttpClient httpClient =HttpClientBuilder.create().build();
🌟创建 HttpGet 请求
可以通过以下方式创建 HttpGet 请求:
HttpGet httpGet =newHttpGet("https://www.example.com/");
🌟发送请求并获取响应
可以通过以下方式发送请求并获取响应:
HttpResponse response = httpClient.execute(httpGet);
🌟处理响应
可以通过以下方式处理响应:
int statusCode = response.getStatusLine().getStatusCode();String responseBody =EntityUtils.toString(response.getEntity());
其中,
response.getStatusLine().getStatusCode()
可以获取响应状态码,
EntityUtils.toString(response.getEntity())
可以获取响应正文。
完整的代码如下:
importorg.apache.http.HttpResponse;importorg.apache.http.client.HttpClient;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.HttpClientBuilder;importorg.apache.http.util.EntityUtils;publicclassHttpClientExample{publicstaticvoidmain(String[] args)throwsException{HttpClient httpClient =HttpClientBuilder.create().build();HttpGet httpGet =newHttpGet("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.2 Servlet 和过滤器注册
ServletRegistrationBean
如果注册失败,和类
FilterRegistrationBean
现在将失败,
IllegalStateException
而不是记录警告。如果您需要旧的行为,您应该调用
setIgnoreRegistrationFailure(true)
您的注册 bean。
2.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
。
2.4 Hibernate 6.2
Spring Boot 3.1 升级到 Hibernate 6.2。请参阅Hibernate 6.2 迁移指南以了解这对您的应用程序有何影响。
2.5 Jackson 2.15
Spring Boot 3.1 升级到 Jackson 2.15。请参阅Jackson wiki以了解这对您的应用程序有何影响。
2.15 中的一个显着变化是引入了处理限制。要调整这些约束,请定义
Jackson2ObjectMapperBuilderCustomizer
类似于以下内容:
@BeanJackson2ObjectMapperBuilderCustomizercustomStreamReadConstraints(){return(builder)-> builder.postConfigurer((objectMapper)-> objectMapper.getFactory().setStreamReadConstraints(StreamReadConstraints.builder().maxNestingDepth(2000).build()));}
2.6 Mockito 5
Spring Boot 3.1 升级到 Mockito 5,特别是 5.3。请参阅 Mockito 发行说明以了解 Mockito 5.x 系列中的显着变化。
2.6 Health Group Membership Validation
现在在启动时验证配置的健康组成员身份。如果包含或排除了不存在的健康指标,启动将失败。可以禁用此验证,恢复早期版本的行为,方法是设置
management.endpoint.health.validate-group-membership
为
false
。
三、增强功能
3.1 服务连接
🌟服务连接概括
引入了新的服务连接概念。此类连接在应用程序中由 bean 表示
ConnectionDetails
。这些 bean 提供了必要的细节来建立与删除服务的连接,并且 Spring Boot 的自动配置已更新为使用
ConnectionDetails
bean。当此类 beans 可用时,它们将优先于任何与连接相关的配置属性。与连接本身无关的配置属性,例如控制连接池大小和行为的属性,仍将被使用。
此低级功能旨在作为其他高级功能的构建块,这些功能通过定义
ConnectionDetails
bean 自动配置服务连接。
🌟 基于属性的 ConnectionDetails Bean
在没有在其他地方定义适当的 bean 的情况下
…ConnectionDetails
,Spring Boot 的自动配置已更新为定义自己的基础,由相关配置属性支持。这允许
…ConnectionDetails
注入而不必处理没有这样的 bean 可用并且需要回退到基于属性的配置的情况。
3.2 测试容器
🌟在开发时使用测试容器
引入了对在开发时使用测试容器管理外部服务的支持。
在开发时使用 Testcontainer 时,可以使用新的 Maven goal(
spring-boot:test-run
) 和 Gradle task(
bootTestRun
) 通过测试 main 方法启动应用程序。
Container
可以使用新注释导入将 Testcontainers 实例声明为静态字段的类
@ImportTestcontainers
。
测试容器生命周期的管理得到改进,确保容器先初始化,最后销毁。对可重复使用容器的支持也得到了改进。
从方法贡献属性
Container
@Bean
,
DynamicPropertyRegistry
现在可以注入。
@DynamicPropertySource
这与您在测试中使用的方式类似。有关详细信息,请参阅下图
🌟测试容器服务连接
使用 Testcontainers 时,
@DynamicPropertySource
通常用于根据容器的设置配置应用程序属性:
@ContainerstaticGenericContainer redis =newGenericContainer(DockerImageName.parse("redis").withTag("4.0.14"));// …@DynamicPropertySourcestaticvoidredisProperties(DynamicPropertyRegistry registry){
registry.add("spring.data.redis.host", redis::getHost);
registry.add("spring.data.redis.port", redis::getFirstMappedPort);}
现在可以简化为以下内容
@Container@ServiceConnectionstaticGenericContainer redis =newGenericContainer(DockerImageName.parse("redis").withTag("4.0.14"));
此处,
@ServiceConnection
指示容器应使用 Redis 连接详细信息的来源。
spring-boot-testcontainers
提供注释的模块将从
@ServiceConnection
容器中提取这些细节,同时仍然允许使用 Testcontainers API 来定义和配置它。
下图查看注释当前支持的服务的完整列表
@ServiceConnection
。
3.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
。
下图展示更多详细信息,包括当前支持的服务列表
3.4 SSL 配置
RestTemplate
Java KeyStore 和 PEM 编码证书等 SSL 信任材料现在可以使用属性进行配置,并
WebClient
以更一致的方式应用于各种类型的连接,例如嵌入式 Web 服务器、数据服务。
使用 PEM 编码证书配置 SSL示例:
带有前缀的配置属性
spring.ssl.bundle.pem
可用于以 PEM 编码文本的形式配置信任材料包。每个包都有一个用户提供的名称,可用于引用该包。
当用于保护嵌入式 Web 服务器时,a
keystore
通常配置有证书和私钥,如本例所示:
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"
3.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:truemy-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
3.6 Docker镜像构建
🌟 图像创建日期和时间
Maven
spring-boot:build-image
目标和
bootBuildImage
Gradle 任务现在有一个
createdDate
配置选项,可用于将
Created
生成的图像元数据中的字段值设置为用户指定的日期或使用
now
当前日期和时间。有关详细信息,请参阅Gradle和Maven插件文档。
🌟图像应用目录
Maven
spring-boot:build-image
目标和
bootBuildImage
Gradle 任务现在有一个
applicationDirectory
配置选项,可用于设置构建器映像中的位置,应用程序内容将上传到该位置以供构建包使用。这也将是应用程序内容在生成的图像中的位置。有关详细信息,请参阅Gradle和Maven插件文档。
四、用于 GraphQL 的 Spring
4.1 异常处理
@GraphQlExceptionHandler
在控制器中声明的方法,或者
@ControllerAdvice
现在由 Spring for GraphQL 开箱即用地支持控制器方法调用。此外,Spring Boot通过
@ControllerAdvice
配置.
DataFetcher
QueryDslDataFetcher
QueryByExampleDataFetcher``GraphQlSource
4.2 分页和排序
当 Spring Data 在类路径上时,GraphQL 的 Spring 现在自动配置为支持分页和排序。
4.3 改进的模式类型生成
GraphQlSource
现在自动配置了一个
ConnectionTypeDefinitionConfigurer
. 它通过查找类型定义名称以“Connection”结尾的字段(被 GraphQL 游标连接 规范视为a )来生成“Connection”类型
Connection Type
,如果它们尚不存在,则添加所需的类型定义。
4.4 支持使用 OTLP 导出跟踪
当
io.opentelemetry:opentelemetry-exporter-otlp
在类路径上时,
OtlpHttpSpanExporter
将自动配置。可以使用
management.otlp.tracing.*
配置属性自定义导出器的配置。
4.5 Wavefront Span 标签定制
如果您正在使用 Wavefront 并且想要为 RED 指标自定义 span 标签,现在有一个名为的新属性
management.wavefront.trace-derived-custom-tag-keys
允许您执行此操作。
4.6 文件和控制台的不同日志级别
如果您使用的是 Logback 或 Log4j2,现在可以选择为控制台日志和文件日志设置不同的日志级别。这可以使用配置属性
logging.threshold.console
和来设置
logging.threshold.file
。
4.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项目VersionsSpring Authorization Server1.1.0Spring Batch5.0.2Spring Data2023.0.0Spring Framework6.0.9Spring GraphQL1.2.0Spring HATEOAS2.1.0Spring Integration6.1.0Spring Kafka3.0.7Spring LDAP3.1.0Spring Security6.1.0Spring Session3.1.0Spring Web Services4.0.4
许多第三方依赖项也已更新,其中一些更值得注意的是:
第三方依赖VersionsCouchbase Java Client3.4.6Elasticsearch Client8.7Hibernate6.2GraphQL Java20.1Jackson2.15.0Kafka3.4.0Kotlin1.8.21Liquibase4.20Micrometer1.11.0Micrometer Tracing1.1.1Mockito5.3Native Build Tools0.9.22Neo4j Java Driver5.8.0OpenTelemetry1.24.0Rabbit AMQP Client5.17.0Reactor BOM2022.0.7Testcontainers1.18Undertow2.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
停止。
版权归原作者 陈书予 所有, 如有侵权,请联系我们删除。