Spring Boot 3.1 发布说明

491 阅读10分钟

升级到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注册

ServletRegistrationBeanFilterRegistrationBean类在注册失败时将抛出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个主题:someTopicsomeTopic-retry-0someTopic-retry-1someTopic-retry-2someTopic-retry-3someTopic-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-managementspring.docker.compose.startup.commandspring.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实现,如QueryDslDataFetcherQueryByExampleDataFetcher等。

分页和排序

当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.consolelogging.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-timeoutoperation-timeoutauto-startupauto-create 属性。

  • 现在将 BatchInterceptor bean 应用于自动配置的 ConcurrentKafkaListenerContainerFactory

  • Nomad 添加到已识别的 CloudPlaform 值列表中。

  • 现在可以为 spring.jmx 指定 registration-policy 属性。

  • SanitizableData 添加了一个 withSanitizedValue 实用方法。

  • 引入了 RabbitTemplateCustomizer。该类型的 bean 将自定义自动配置的 RabbitTemplate

  • 现在支持 CNB Platform API 0.11。

  • spring-boot-starter-parentmaven.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 时,用于创建自动配置的 SdkTracerProviderSdkTracerProviderBuilder 可以通过定义 SdkTracerProviderBuilderCustomizer bean 进行自定义。

  • MockServerRestTemplateCustomizer 现在通过新的 setBufferContent 方法支持启用内容缓冲。

  • 在自动配置时,可以通过定义 BatchConversionServiceCustomizer bean 来自定义 Spring Batch 使用的转换服务。

  • 用于创建 JWK Set URI 的 JTW 解码器的构建器可以通过定义 JwkSetUriReactiveJwtDecoderBuilderCustomizerJwkSetUriJwtDecoderBuilderCustomizer 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