升级到Spring Boot 3.0
对于Apache HttpClient 4的依赖管理
在Spring Framework 6
中,对于RestTemplate
的支持已移除了对Apache HttpClient 4
的支持,改为支持Apache HttpClient 5
。Spring Boot 3.0包含对HttpClient 4和5的依赖管理。继续使用HttpClient 4
的应用程序在使用RestTemplate
时可能会遇到难以诊断的错误。
Spring Boot 3.1移除了对HttpClient 4
的依赖管理,鼓励用户改用HttpClient 5
。
Servlet和Filter注册
ServletRegistrationBean
和FilterRegistrationBean
类在注册失败时将抛出IllegalStateException
异常,而不是记录警告。如果需要旧的行为,请在注册bean上调用setIgnoreRegistrationFailure(true)
。
Git Commit ID Maven插件版本属性
用于覆盖io.github.git-commit-id:git-commit-id-maven-plugin
版本的属性已更新,以与其构件名称对齐。为适应此更改,请在pom.xml中将git-commit-id-plugin.version
替换为git-commit-id-maven-plugin.version
。
Spring Kafka重试Topic自动配置
在使用自动配置的可重试Topic配置(spring.kafka.retry.topic.enabled: true)
时,采用指数退避和最大延迟的Apache Kafka,在最大延迟级别上的所有重试现在都发送到同一个Topic。之前,即使超过最大延迟,每次重试都使用单独的Topic。
例如,如果最大重试次数为5,延迟为1秒,乘数为2,最大延迟为3秒,在初始失败后,重试将在1秒、2秒、3秒、3秒执行。在Spring Boot的早期版本中,框架将创建6个主题:someTopic
、someTopic-retry-0
、someTopic-retry-1
、someTopic-retry-2
、someTopic-retry-3
和someTopic-dlt
。随着这个变化,someTopic-retry-3
这个Topic将不会被创建,而是所有3秒的重试将在someTopic-retry-2
中进行。在从早期的Spring Boot版本迁移后,您可以在所有记录被消费后安全地删除someTopic-retry-3
Topic。
对于Testcontainers的依赖管理
Spring Boot的依赖管理现在包括Testcontainers
。如果需要,可以使用testcontainers.version
属性覆盖由Spring Boot管理的版本。
Hibernate 6.2
Spring Boot 3.1升级到Hibernate 6.2。请参考Hibernate 6.2迁移指南,了解这对您的应用程序可能产生的影响。
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())
);
}
Mockito 5
Spring Boot 3.1升级到Mockito 5,具体是5.3版本。请参考Mockito发布说明,了解Mockito 5.x系列中的重要变化。
健康组成员验证
在启动时,现在会验证健康组的配置成员身份。如果包含或排除了不存在的健康指标,启动将失败。可以通过将management.endpoint.health.validate-group-membership
设置为false
来禁用此验证,恢复早期版本的行为。
最低要求的变化
没有变化。
新功能和值得注意的变化
提示 查看配置更改日志,以获取配置更改的完整概述。
服务连接
引入了新的服务连接概念。这样的连接在应用程序中由ConnectionDetails
bean表示。这些bean提供了建立与远程服务连接所需的详细信息,Spring Boot的自动配置已更新为使用ConnectionDetails
bean。当这样的bean可用时,它们将优先于任何与连接相关的配置属性。与连接本身无关的配置属性,例如控制连接池的大小和行为的属性,仍将被使用。
这个底层功能旨在作为其他更高级别功能的构建块,通过定义ConnectionDetails
bean来自动配置服务连接。
基于属性的ConnectionDetails Beans
在没有定义适当的...ConnectionDetails
beans的情况下,Spring Boot的自动配置已更新为基于相关配置属性定义自己的ConnectionDetails
beans。这允许注入...ConnectionDetails
,而无需处理没有此类bean可用且需要回退到基于属性的配置的情况。
Testcontainers 在开发时使用Testcontainers
引入了在开发时使用Testcontainers来管理外部服务的支持。
使用新的Maven目标(spring-boot:test-run)
和Gradle任务(bootTestRun)
可以在使用Testcontainers
进行开发时通过测试主方法启动应用程序。
通过使用新的@ImportTestcontainers
注解,可以导入声明了Testcontainers Container
实例作为静态字段的类。有关详细信息,请参阅参考文档。
改进了对Testcontainers生命周期的管理,确保容器首先初始化并最后销毁。还改进了可重用容器的支持。
现在可以通过注入DynamicPropertyRegistry
来贡献来自Container @Bean方法的属性。这类似于您可以在测试中使用的@DynamicPropertySource
的方式。有关详细信息,请参阅参考文档。
Testcontainers服务连接
在使用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
注解支持的服务的完整列表,请参阅参考文档。
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
配置属性来自定义这个生命周期管理以及用于启动和关闭服务的命令。
有关详细信息,请参阅参考文档,包括当前支持的服务列表。
SSL配置
现在可以使用属性来配置SSL信任材料,例如Java密钥库和PEM编码的证书,并以更一致的方式应用于各种类型的连接,如嵌入式Web服务器
、数据服务
、RestTemplate和WebClient
。
有关更多信息,请参阅参考文档。
Spring授权服务器的自动配置
此版本提供了对Spring授权服务器项目的支持,同时还提供了一个新的spring-boot-starter-oauth2-authorization-server
启动器。有关更多信息,请参阅Spring Boot参考文档中的Authorization Server
部分。
Docker镜像构建
镜像创建日期和时间
spring-boot:build-image Maven
目标和bootBuildImage Gradle
任务现在具有createdDate
配置选项,可用于将生成的镜像的元数据中的Created
字段的值设置为用户指定的日期,或者设置为now以使用当前日期和时间。有关详细信息,请参阅Gradle和Maven插件文档。
镜像应用程序目录
spring-boot:build-image
Maven目标和bootBuildImage
Gradle任务现在具有applicationDirectory
配置选项,可用于设置构建图像中应用程序内容将上传到的位置,以供buildpacks
使用。这也将是生成的镜像中应用程序内容的位置。有关详细信息,请参阅Gradle和Maven插件文档。
用于GraphQL的Spring
异常处理
控制器或@ControllerAdvice
中声明的@GraphQlExceptionHandler
方法现在由Spring for GraphQL对控制器方法调用提供了开箱即用的支持。此外,Spring Boot通过对GraphQlSource的配置自动配置了@ControllerAdvice
异常处理,用于其他(非控制器)DataFetcher实现,如QueryDslDataFetcher
、QueryByExampleDataFetcher
等。
分页和排序
当Spring Data在类路径上时,Spring for GraphQL现在自动配置了对分页和排序的支持。
改进的模式类型生成
GraphQlSource现在使用ConnectionTypeDefinitionConfigurer
进行自动配置。它通过查找类型定义名称以"Connection"结尾的字段来生成"Connection"类型
,根据GraphQL Cursor Connections规范,这被认为是一种Connection类型,并在必要时添加所需的类型定义。
使用OTLP导出跟踪的支持
当io.opentelemetry:opentelemetry-exporter-otlp
在类路径上时,将自动配置OtlpHttpSpanExporter
。可以使用management.otlp.tracing.*
配置属性自定义导出器的配置。
Wavefront Span Tag自定义
如果您正在使用Wavefront并且想要自定义RED指标的span标签,现在有一个名为management.wavefront.trace-derived-custom-tag-keys
的新属性可以实现。有关详细信息,请参阅#34194。
文件和控制台的不同日志级别
如果您正在使用Logback或Log4j2,现在可以为控制台日志和文件日志设置不同的日志级别。可以使用配置属性logging.threshold.console
和logging.threshold.file
进行设置。
最大HTTP响应头大小
如果您正在使用Tomcat或Jetty,现在可以限制最大的HTTP响应头大小。对于Tomcat,您可以使用server.tomcat.max-http-response-header-size
属性,对于Jetty,您可以使用server.jetty.max-http-response-header-size
属性。默认情况下,响应头限制为8kb。
ActiveMQ支持
自动配置ActiveMQ客户端的支持在Spring Boot 3.0中已被恢复,但嵌入式ActiveMQ代理的支持尚未恢复,因为ActiveMQ代理尚不支持JMS 3.0。
依赖项升级
Spring Boot 3.1.0升级了几个Spring项目的新版本:
-
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
还更新了许多第三方依赖项,其中一些比较重要的有:
-
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 注册表发送标头。 -
现在可以在 AOT 处理中使用
JoranConfigurators
bean。 -
在
spring.kafka.admin
中添加了额外的close-timeout
、operation-timeout
、auto-startup
和auto-create
属性。 -
现在将
BatchInterceptor
bean 应用于自动配置的ConcurrentKafkaListenerContainerFactory
。 -
将
Nomad
添加到已识别的CloudPlaform
值列表中。 -
现在可以为
spring.jmx
指定registration-policy
属性。 -
向
SanitizableData
添加了一个withSanitizedValue
实用方法。 -
引入了
RabbitTemplateCustomizer
。该类型的 bean 将自定义自动配置的RabbitTemplate
。 -
现在支持 CNB Platform API 0.11。
-
spring-boot-starter-parent
将maven.compiler.release
设置为配置的 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
的SdkTracerProviderBuilde
r 可以通过定义SdkTracerProviderBuilderCustomizer
bean 进行自定义。 -
MockServerRestTemplateCustomizer
现在通过新的setBufferContent
方法支持启用内容缓冲。 -
在自动配置时,可以通过定义
BatchConversionServiceCustomizer
bean 来自定义Spring Batch
使用的转换服务。 -
用于创建 JWK Set URI 的 JTW 解码器的构建器可以通过定义
JwkSetUriReactiveJwtDecoderBuilderCustomizer
或JwkSetUriJwtDecoderBuilderCustomizer
bean 进行自定义。 -
已恢复对 io.r2dbc:r2dbc-mssql 的依赖管理。
-
Logback 的根日志级别现在默认为尽早的 INFO。
-
默认情况下,使用 stop 而不是 down 来停止 Docker Compose。
Spring Boot 3.1.0 中的弃用项
-
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 bundles
。