如果希望继续注入DynamicPropertyRegistry(可能会遇到上述生命周期问题),可将spring.testcontainers.dynamic-property-registry-injection设置为warn或allow。前者将记录警告日志,同时允许使用注入的DynamicPropertyRegistry。后者将默许使用注入的DynamicPropertyRegistry,完全恢复_ Spring Boot3.3_的行为。
为了获得更快的启动时间和更高效的_WebJars_资源解析(参考这里),你需要更新pom.xml/build.gradle以依赖org.webjars:webjars-locator-lite而不是org.webjars:webjars-locator-core(这两个依赖项都由 Spring Boot管理)。注意,Spring 中的org.webjars:webjars-locator-core支持现已过时,并将在未来版本中移除。请参阅有关此功能的参考文档部分。
删除了 OkHttp 的依赖管理
Spring Boot 不再依赖_OkHttp_,因此不再管理其版本。如果你的应用依赖于_OkHttp_,请更新构建,以使用符合需求的 OkHttp 版本。
Spring Boot 3.2 中的弃用
Spring Boot 3.2 中被弃用并标记为将在 3.4 中移除的类、方法和属性已在此版本中移除。请在升级前确保没有调用已废弃的方法。
新的spring.application.group属性可用于将应用分组,例如,如果它们都属于某个业务单元或一个更大的应用调度。设置该属性后,日志信息中也会包含该属性。可以使用logging.include-application.group属性控制这一行为。Application Group 也会自动添加到 OpenTelemetryResource中。
Spring Boot 3.4 正式发布
Spring Boot 3.4 已正式发布。
从 Spring Boot 3.3 升级
Rest Client和 RestTemplate
已添加对自动配置
RestClient和RestTemplate以使用_Reactor Netty_的HttpClient或_JDK_的HttpClient的支持。按优先顺序,现在支持的 客户端如下:HttpComponentsClientHttpRequestFactory)JettyClientHttpRequestFactory)HttpClient(ReactorClientHttpRequestFactory)HttpClient(JdkClientHttpRequestFactory)HttpURLConnection(SimpleClientHttpRequestFactory)需要注意的是,如果类路径上没有_HTTP_Client 库,就可能会使用
JdkClientHttpRequestFactory,而之前使用的是SimpleClientHttpRequestFactory。可以通过设置spring.http.client.factory来选择特定的客户端。支持的值包括http-components、jetty、reactor、jdk和simple。默认情况下,所有五个客户端都会自动跟随重定向。要禁用此行为,可将
spring.http.client.redirects设置为dont-follow。Apache HTTP Components 和 Envoy
Apache HTTP Components(组件)更改了
HttpClient中有关_HTTP/1.1 TLS_升级的默认设置。大多数代理服务器都能顺利处理升级,但_Envoy_或_Istio_可能会遇到问题。如果需要恢复以前的行为,可以使用新的
ClientHttpRequestFactoryBuilder定义一个HttpComponentsClientHttpRequestFactoryBuilder并应用以下自定义设置:配置 Bean 的属性 验证
在之前的版本中,当使用
@Validated注解的@ConfigurationProperties类通过诸如_Hibernate Validator_这样的 Bean Validation 实现进行验证时,会在绑定时对嵌套属性进行验证,而不管是否使用了@Valid。在_ Spring Boot3.4_版本中,现在验证遵循 Bean Validation 规范的行为。验证是从@ConfigurationProperties注解的类开始进行的,只有在相应字段使用@Valid注解时,验证才会级联到嵌套属性。升级时,检查带有 Bean 验证约束的
@ConfigurationProperties类。在需要验证层级联嵌套属性的地方添加@Valid。基于 Bean 的条件
@ConditionalOnBean和@ConditionalOnMissingBean在@Bean方法上使用时的行为发生了变化,当设置了注解属性时。与以前一样,这两个条件都将使用@Bean方法的返回类型作为要匹配的类型的默认值。在以前,如果设置了name、type或value,则不会使用此默认值。从_Spring Boot 3.4_开始,如果设置了annotation(注解),也不会使用此默认值。要恢复先前的行为,请同时指定一个value(值),该值是@Bean方法的返回类型,以及annotation(注解)。优雅停机
嵌入式 Web 服务器(Jetty、Rector Netty、Tomcat 或 Undertow)的优雅关机现在已默认启用。如果需要恢复以前的行为,可将
server.shutdown设置为immediate。用于构建 OCI 镜像的 Paketo Tiny Builder
使用 Maven
spring-boot:build-imageGoal 或 GradlebootBuildImageTask 为 JVM 应用构建 OCI 镜像时使用的默认_Cloud Native Buildpacks_Builder 已从paketobuildpacks/builder-jammy-base更改为paketobuildpacks/builder-jammy-java-tiny。这将使镜像更小。tinyBuilder 不包含_shell_,因此可能不适用于需要启动脚本来运行程序的 应用。有关自定义 Builder 的信息,请参阅Maven或Gradle文档。Testcontainer 和动态属性
通过注入
DynamicPropertyRegistry来定义动态属性的支持已被弃用,现在尝试这样做将默认失败。与其注入DynamicPropertyRegistry,不如实现一个单独的@Bean方法来返回DynamicPropertyRegistrar。这个单独的 Bean 方法应注入将从中获取属性值的容器。这样可以解决一些容器生命周期问题,并确保在使用属性之前,已经启动了获取属性值的容器。如果希望继续注入
DynamicPropertyRegistry(可能会遇到上述生命周期问题),可将spring.testcontainers.dynamic-property-registry-injection设置为warn或allow。前者将记录警告日志,同时允许使用注入的DynamicPropertyRegistry。后者将默许使用注入的DynamicPropertyRegistry,完全恢复_ Spring Boot3.3_的行为。@AutoConfigureTestDatabase 和容器
@AutoConfigureTestDatabase注解现在会尝试检测数据库是否来自容器。如果要将注解用于容器数据库,则无需再添加replace=Replace.NONE。如果需要恢复到旧的行为,可在注解中设置
replace=Replace.AUTO_CONFIGURED。控制对 Actuator 端点的访问
对启用和禁用端点的支持进行了重新设计,用更精细的访问模型取代了原来提供的 on/off(开/关)支持。除了禁用端点(
none权限)和完全启用端点(unrestricted权限)外,新模型还支持只允许read-only(只读)访问端点操作。以下属性已被弃用:
management.endpoints.enabled-by-defaultmanagement.endpoint.<id>.enabled替代属性为:
management.endpoints.access.defaultmanagement.endpoint.<id>.access同样,
@Endpoint上的enableByDefault属性已被弃用,取而代之的是一个新的defaultAccess属性。作为这些更改的一部分,无论使用
@ConditionalOnEnabledEndpoint与否,默认启用现在都是一致应用的。如果在升级时失去了对端点的访问权限,可将management.endpoint.<id>.access设置为read-only或unrestricted,或将management.endpoint.<id>.enabled设置为true,以使端点再次可访问。此外,还引入了一个新属性,允许运维控制允许访问 Actuator 端点的级别:
management.endpoints.access.max-permitted此属性限制了可能已为端点配置的任何访问权限。例如,如果
management.endpoints.access.max-permitted设置为read-only,而management.endpoint.loggers.access设置为unrestricted,则只允许对_loggers_端点进行只读访问。暴露 Cloud Foundry ConditionalOnAvailableEndpoint
与
@ConditionalOnAvailableEndpoint一起使用的EndpointExposure.CLOUD_FOUNDRY枚举值已被弃用,转而使用EndpointExposure.WEB。典型的 Spring Boot 应用可能不会受到此更改的影响,但是,如果你有自定义的 Cloud Foundry 特定 Actuator 端点 bean,则应更新你的条件以使用EndpointExposure.WEB。HtmlUnit 4.3
HtmlUnit 已升级至 4.3。升级后,依赖坐标从
net.sourceforge.htmlunit:htmlunit变为org.htmlunit:htmlunit,package名称从com.gargoylesoftware.htmlunit. 变为org.htmlunit。升级时,请相应更新构建配置和import。Selenium HtmlUnit 4.22
Selenium HtmlUnit 已更新至 4.22。升级后,依赖坐标从
org.seleniumhq.selenium:htmlunit-driver变为org.seleniumhq.selenium:htmlunit3-driver。升级时,请相应更新你的构建配置。WebJars Locator 整合
为了获得更快的启动时间和更高效的_WebJars_资源解析(参考这里),你需要更新
pom.xml/build.gradle以依赖org.webjars:webjars-locator-lite而不是org.webjars:webjars-locator-core(这两个依赖项都由 Spring Boot管理)。注意,Spring 中的org.webjars:webjars-locator-core支持现已过时,并将在未来版本中移除。请参阅有关此功能的参考文档部分。删除了 OkHttp 的依赖管理
Spring Boot 不再依赖_OkHttp_,因此不再管理其版本。如果你的应用依赖于_OkHttp_,请更新构建,以使用符合需求的 OkHttp 版本。
Spring Boot 3.2 中的弃用
Spring Boot 3.2 中被弃用并标记为将在 3.4 中移除的类、方法和属性已在此版本中移除。请在升级前确保没有调用已废弃的方法。
最低要求的变更
Gradle
不再支持 Gradle 7.5、8.0、8.1、8.2 和 8.3。现在需要 Gradle 7.x(7.6.4 或更高版本)或 Gradle 8.x(8.4 或更高版本)。
最新的和值得关注的地方
你可以查看配置更改日志,了解配置更改的完整概览。
结构化日志记录
通过对_Elastic Common Schema_(
ecs)、Graylog Extended Log Format(gelf) 和_Logstash_(logstash)的内置支持,引入了对结构化日志的支持。 要启用结构化文件日志记录,可将logging.structured.format.file设置为ecs、elf或logstash。同样,要启用结构化控制台日志,可将logging.structured.format.console设置为相应的值。要进一步了解 Spring Boot 对结构化日志的支持,包括如何定义自定义格式,请参阅参考文档。
@FallbackBean@ConditionalOnSingleCandidate现在支持@FallbackBean。如果有单个 Primary Bean,条件就会匹配;如果没有 Primary Bean,如果有单个非 Fallback Bean,条件也会匹配。定义额外 Bean
在类型匹配时,基于 Bean 的条件现在会忽略任何非默认候选 Bean。通过声明 Bean 不是默认候选(使用
@Bean(defaultCandidate=false)),现在可以定义自动配置类型的 Bean,而不会导致相同类型的自动配置 Bean_Back Off_。这减少了在同一 应用中使用两个DataSourceBean或两个EntityManagerFactoryBean时所需的配置。ClientHttpRequestFactory Builder
新增的
ClientHttpRequestFactoryBuilder接口可让你为特定技术构建ClientHttpRequestFactory实例。 Builder 允许对底层组件进行细粒度定制,并以一致的方式应用通用设置。使用接口的静态工厂方法,可为特定库创建以下 Builder:
ClientHttpRequestFactoryBuilder.httpComponents())ClientHttpRequestFactoryBuilder.jetty())HttpClient(ClientHttpRequestFactoryBuilder.reactor())HttpClient(ClientHttpRequestFactoryBuilder.jdk())HttpURLConnection(ClientHttpRequestFactoryBuilder.simple())更多详情,包括如何使用配置属性应用常用设置,请参阅更新的参考文档。
可观测性的改进
应用分组
新的
spring.application.group属性可用于将应用分组,例如,如果它们都属于某个业务单元或一个更大的应用调度。设置该属性后,日志信息中也会包含该属性。可以使用logging.include-application.group属性控制这一行为。Application Group 也会自动添加到 OpenTelemetryResource中。OTLP
现在可以通过_gRPC_传输发送 OTLP Span。为此,请将新的配置属性
management.otlp.tracing.transport设置为grpc。该属性默认为http。服务连接支持也已添加。management.otlp.logs下的新属性可用于自动配置OpenTelemetry的OtlpHttpLogRecordExporter和SdkLoggerProvider。可观测性的其他更新
ProcessInfoContributor现在还能显示有关堆和非堆使用情况的内存信息。新的
management.otlp.tracing.export.enabled、management.wavefront.tracing.export.enabled和management.zipkin.tracing.export.enabled属性现在可用于更精细地启用或禁用 Trace 导出。AssertJ 支持 MockMvc
当 AssertJ 位于 classpath 上时,
MockMvcTester会自动配置。MockMvcTester可让你使用 Fluent 风格的 API 来定义请求和断言。它可以在任何MockMvc可以使用的地方进行注入。有关详细信息,请参阅 Spring Framework参考文档中的专门章节。
Spring Pulsar
现在提供了配置属性用于配置默认的租户和命名空间。当使用未完全限定的 Topic URL 来消费或生产消息时,默认值将 应用。你可以使用
spring.pulsar.defaults.topic.tenant和spring.pulsar.defaults.topic.namespace配置属性进行配置,或者定义自己的PulsarTopicBuilderBean。设置spring.pulsar.defaults.topic.enabled=false可禁用默认值。新增了
PulsarContainerFactoryCustomizer接口,以支持对自动配置的PulsarContainerFactory进行自定义。spring.pulsar.consumer.subscription.name配置属性现在适用于自动配置的 Pulsar 监听器容器。引入了两个新的配置属性,用于配置 Pulsar 客户端的并发性:
spring.pulsar.client.threads.io控制用于处理 Broker 连接的线程数量。spring.pulsar.client.threads.listener控制用于消息监听的线程数。最后,新的
spring.pulsar.listener.concurrency属性可用于控制自动配置的_Pulsar_消息监听器容器的并发性。Couchbase 认证
客户端证书(Client Certificate)现在可用于验证_Couchbase_群集,以替代基本的用户名和密码验证。更多详情,请参阅参考文档。
FreeMarker
自动配置_FreeMarker_的配置对象所使用的_FreeMarker_变量现在可以自定义。为此,请定义一个或多个
FreeMarkerVariablesCustomizer类型的 Bean。这些 Bean 将根据其定义的顺序(如果有)被调用。通过 ActiveMQ Classic 支持嵌入式 Broker
现在 ActiveMQ Classic 再次支持嵌入式代理,自动配置已更新以支持该功能。
注意,与_Spring Boot 2.7.x_不同,ActiveMQ Starter 仅支持 客户端。要使用嵌入式 Broker,应在应用中添加
org.apache.activemq:activemq-broker。配置元数据
注解处理器(Annotation Processor)现在可以检测到
Enum的默认值。如果你手动添加了元数据以提供自定义属性的值,请务必将其删除。废弃和替换自动配置类
为了使自动配置的演进更加容易,我们引入了对自动配置类的废弃和替换的支持。可在新的
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.replacements文件中声明替换。要了解更多信息,请参阅参考文档。虚拟线程
如果启用了虚拟线程,以下组件将使用虚拟线程:
OtlpMeterRegistry镜像构建的改进
Spring Boot 现在默认使用
paketobuildpacks/builder-jammy-java-tiny。该 Builder 开箱即支持 ARM 和 x64 平台。Maven 和 Gradle 构建 OCI 镜像的插件中新增了一个
trustBuilder选项。此选项控制 CNB 生命周期的调用方式,在使用来自不受信任来源的 Builder 时提供了改进的安全性。默认情况下,来自_Paketo_项目、_Heroku_和_Google_的构建器是可信任的。有关详细信息,请参阅Maven或Gradle文档。Maven 和 Gradle 构建 OCI 镜像的插件中新增了一个
imagePlatform选项。此选项可用于指定任何 CNB Builder、运行时和 Buildpack 镜像的操作系统和架构,以便运行 CNB Builder。当主机平台支持模拟其他操作系统/架构(例如,在使用 Apple 芯片的 Mac 上使用 Rosetta 模拟 ARM 主机上的 AMD 架构)时,可以使用此选项为与主机平台的操作系统和架构不同的操作系统和架构构建镜像。有关更多信息,请参阅Maven或Gradle文档。Docker Compose 的改进
Docker Compose 现在支持多个 Docker Compose 配置文件。
命令行参数
新属性
spring.docker.compose.start.arguments和spring.docker.compose.stop.arguments可用于指定启动和停止服务时传递给 Docker Compose 子命令的附加命令行参数。新增的spring.docker.compose.arguments属性可将参数传递给 Docker Compose。支持的更新
POSTGRES_HOST_AUTH_METHOD=trust环境变量。redis/redis-stack和redis/redis-stack-server容器镜像。grafana/otel-lgtm容器镜像新增了对Grafana LGTM的支持。HazelcastConnectionDetails)。Testcontainers 改进
org.testcontainers.kafka.KafkaContainer的支持。redis/redis-stack和redis/redis-stack-server容器镜像,添加了对_Redis Stack_和_Redis Stack Server_的支持。org.testcontainers.grafana.LgtmStackContainer的支持。HazelcastConnectionDetails)。RedisContainer的支持。Actuator
可插拔的 Actuator Exposer
现在可以通过可插拔的方式扩展 Spring Boot以暴露 Actuator 端点。新的
EndpointExposureOutcomeContributor接口可用于影响@ConditionalOnAvailableEndpoint条件。与现有的 Cloud Foundry 支持类似,该扩展将使我们更容易提供额外的平台集成。
SSL 信息和健康检查
如果你使用 SSL Bundle,
/actuator/info下现在有一个新的端点可以显示 SSL 信息(有效日期、签发者、主题等)。该端点还会显示即将过期的证书,以提醒你需要尽快更换。新的配置属性名为management.health.ssl.certificate-validity-warning-threshold,用于配置阈值。还新增了 SSL 证书监控健康检查。如果证书无效,会将状态设置为
OUT_OF_SERVICE。/actuator/scheduledtasks端点中的其他信息/scheduledtasksActuator 端点现在可公开有关定时调度任务的其他元数据,如 “下一次计划执行时间” 和 “上一次执行时间、状态和异常”。依赖升级
Spring Boot 3.4 迁移到多个 Spring 项目的新版本:
此外,还更新了许多第三方依赖,其中比较值得注意的有以下几项:
其他
除上述更改外,还有许多细微的调整和改进,包括:
Customizer<Liquibase>Bean 在使用_Liquibase_之前对其进行自定义了。JCachePropertiesCustomizerBean 来自定义用于创建 JCacheCacheManager的属性。viewNameTranslator的 Bean 来定制 Spring MVC 使用的RequestToViewNameTranslator。LettuceClientOptionsBuilderCustomizerBean 来定制 Lettuce 的_ClientOptions_。要对整个LettuceClientConfiguration进行更广泛的配置,请继续使用LettuceClientConfigurationBuilderCustomizer。ProxyConnectionFactoryCustomizer可用于定制 R2DBCProxyConnectionFactory。spring.mail.ssl.*配置JavaMailSender上的 TLS 与 SSL Bundle。spring.gson.strictness属性进行配置。@Name来自定义其名称。DataSource派生时,如果源数据源的 URL 没有公开驱动类名,DataSourceBuilder现在可以使用源数据源的 URL 确定驱动类名。spring.application.version可用于读取和设置 应用版本。该属性的默认值取自_manifest_的Implementation-Version。EntityManagerFactoryBuilder也定义了原生(如_Hibernate_)属性。@EnableScheduling,Spring Integration 的TaskScheduler现在也能感知虚拟线程。@ConditionalOnAvailableEndpoint现在为端点提供了一个value别名。spring.data.web.pageable.serialization-mode。SpringApplication.from(...)语法时,现在可以指定要激活的额外 Profile。buildpack环境中设置BP_NATIVE_IMAGE: true。@ConfigurationPropertiesbean 现在尊重@DependsOn、@Description、@Fallback、@Lazy、@Primary、@Scope和@Role注解。MultiFormatStringBuilderFormattable。spring.jms.listener.max-messages-per-task,用于配置监听器在一个任务中处理的消息的最大数量。EndpointRequest类现在都提供toAdditionalPaths(...)方法。partitioned属性现在可以通过属性进行设置。server.jetty.max-form-keys属性,用于自定义 Jetty 的最大表单 Key 值。management.otlp.logging.connect-timeout和management.otlp.tracing.connect-timeout属性,用于配置与 OTLP Collector 的连接超时。--enable-sbom=sbom构建原生镜像时,现在会自动检测_SBOM_。DatabaseDriver枚举现在支持 ClickHouse JDBC 驱动。management.logging.export.enabled和management.otlp.logging.export.enabled可用于禁用日志导出。TaskExecutor可通过定义注解为@BatchTaskExectuor的TaskExecutorBean 进行自定义。indexedRepository 类型。HikariCheckpointRestoreLifecycle将记录一个警告。Spring Boot 3.4 中的弃用
spring.gson.lenient替换为spring.gson.strictness。@MockBean和@SpyBean分别取代 Spring Framework 的@MockitoBean和MockitoSpyBean。org.springframework.boot.ResourceBanner#getApplicationVersion(Class<?>)改用spring.application.version属性。org.springframework.boot.SpringApplication#logStartupInfo(boolean)替换为org.springframework.boot.SpringApplication#logStartupInfo(ConfigurationApplicationContext)。org.springframework.boot.logging.logback.ApplicationNameConverter替换为org.springframework.boot.logging.logback.EnclosedInSquareBracketsConverter。org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure#CLOUD_FOUNDRY替换为org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure#WEB。org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails#getUrl()替换为getUrl(Transport)。org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryAutoConfiguration替换为org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryTracingAutoConfiguration。OtlpAutoConfiguration已取代OtlpTracingAutoConfiguration。management.endpoints.enabled-by-default和management.endpoint.<id>.enabled分别取代management.endpoints.access.default和management.endpoint.<id>.access。@Endpoint上的enableByDefault替换为defaultAccess。Ref:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.4-Release-Notes
发布公告:https://spring.io/blog/2024/11/21/spring-boot-3-4-0-available-now