新增对 RestClient
和 RestTemplate
自动配置的支持,可用 Reactor Netty 的 HttpClient
或 JDK 的 HttpClient
。支持的客户端优先级:
HttpComponentsClientHttpRequestFactory
)JettyClientHttpRequestFactory
)HttpClient
(ReactorClientHttpRequestFactory
)HttpClient
(JdkClientHttpRequestFactory
)HttpURLConnection
(SimpleClientHttpRequestFactory
)若类路径没有 HTTP 客户端库,默认可能用 JdkClientHttpRequestFactory
,而非之前的 SimpleClientHttpRequestFactory
。可以通过设置 spring.http.client.factory
来选择特定客户端,支持的值包括 http-components
、jetty
、reactor
、jdk
和 simple
。
所有五个客户端默认会遵循重定向。如需禁用此行为,可以将 spring.http.client.redirects
设置为 dont-follow
。
Apache HTTP Components 的 HttpClient
在 HTTP/1.1 的 TLS 升级默认行为有所改变。虽然大多数代理服务器可以正确处理升级,但使用 Envoy 或 Istio 时可能会遇到问题。
如果需要恢复以前的行为,可用新的 ClientHttpRequestFactoryBuilder
。定义一个 HttpComponentsClientHttpRequestFactoryBuilder
并按以下方式自定义:
@Bean
public HttpComponentsClientHttpRequestFactoryBuilder httpComponentsClientHttpRequestFactoryBuilder() {
return ClientHttpRequestFactoryBuilder.httpComponents()
.withDefaultRequestConfigCustomizer((builder) -> builder.setProtocolUpgradeEnabled(false));
}
之前,当一个 @ConfigurationProperties
类标注了 @Validated
并通过 Bean Validation(如 Hibernate Validator)实现进行验证时,其嵌套属性会在绑定时被验证,无论是否使用 @Valid
。
Spring Boot 3.4 开始,验证行为与 Bean Validation 规范一致。验证从 @ConfigurationProperties
注解的类开始,并仅在嵌套属性对应的字段标注了 @Valid
时才进行级联验证。
升级时,请检查使用了 Bean Validation 约束的 @ConfigurationProperties
类,并在需要对嵌套属性进行级联验证的地方添加 @Valid
。
@ConditionalOnBean
和 @ConditionalOnMissingBean
在 @Bean
方法中使用并设置了 annotation
属性时,其行为有所更改。两者仍然默认使用 @Bean
方法的返回类型作为匹配的默认类型。然而,从 Spring Boot 3.4 开始,如果设置了 annotation
,此默认值将不会被使用。如果需要恢复以前的行为,请同时指定一个与 @Bean
方法返回类型一致的 value
和 annotation
。
嵌入式 Web 服务器(Jetty、Reactor Netty、Tomcat 或 Undertow)的优雅关机功能现已默认启用。如需恢复之前的立即关机行为, server.shutdown
置 immediate
。
在使用 Maven 的 spring-boot:build-image
目标为 JVM 应用程序构建 OCI 镜像时,默认的 Cloud Native Buildpacks 构建器已从 paketobuildpacks/builder-jammy-base
更改为 paketobuildpacks/builder-jammy-java-tiny
。这将生成更小的镜像。但由于 tiny
构建器不包含 shell,因此可能无法适用于需要通过启动脚本运行的应用程序。有关自定义构建器的详细信息,请参阅 Maven 文档。
通过将 DynamicPropertyRegistry
注入到 @Bean
方法中来定义动态属性的功能已被弃用,现在默认会导致失败。替代方法是实现一个单独的 @Bean
方法,返回一个 DynamicPropertyRegistrar
,此方法应注入属性值来源的容器。这种方式解决了一些容器生命周期问题,并确保属性值来源的容器在属性被使用之前已经启动。
如果仍希望注入 DynamicPropertyRegistry
(需承担可能的生命周期问题),可以将 spring.testcontainers.dynamic-property-registry-injection
设置为 warn
或 allow
。前者会记录警告但允许注入,后者则会完全恢复 Spring Boot 3.3 的行为。
@AutoConfigureTestDatabase
注解现在会自动检测数据库是否来源于容器。如果是,则无需再添加 replace=Replace.NONE
。
如需恢复旧的行为,可以在注解中设置 replace=Replace.AUTO_CONFIGURED
。
启用和禁用端点的支持已被重新设计,替换为更细粒度的访问控制模型。新的模型不仅支持禁用端点(访问级别为 none
)和完全启用端点(访问级别为 unrestricted
),还支持只允许端点操作的“只读”访问(访问级别为 read-only
)。
以下属性已被弃用:
management.endpoints.enabled-by-default
management.endpoint..enabled
其替代属性为:
management.endpoints.access.default
management.endpoint..access
同样,@Endpoint
注解中的 enableByDefault
属性已被弃用,新的 defaultAccess
属性取代了它。
作为更改的一部分,enabled-by-default
的应用现在更加一致,并与是否使用了 @ConditionalOnEnabledEndpoint
无关。如果升级后失去了某个端点的访问权限,可以将 management.endpoint.
设置为 read-only
或 unrestricted
,或者将 management.endpoint.
设置为 true
,以使端点重新可用。
另外,还引入了一个新属性,用于控制 Actuator 端点访问级别的上限:
management.endpoints.access.max-permitted
此属性限制所有配置的访问级别。例如,如果 management.endpoints.access.max-permitted
设置为 read-only
,而 management.endpoint.loggers.access
设置为 unrestricted
,则日志记录端点仅允许只读访问。
在使用 @ConditionalOnAvailableEndpoint
注解时,原本使用的枚举值 EndpointExposure.CLOUD_FOUNDRY
已被弃用,建议改用 EndpointExposure.WEB
。对于典型的 Spring Boot 应用,这一更改通常不会有影响。但如果你定义了自定义的 Cloud Foundry 特定 Actuator 端点 bean,则需要将条件更新为使用 EndpointExposure.WEB
。
HtmlUnit 已升级至 4.3。本次升级中,依赖坐标从 net.sourceforge.htmlunit:htmlunit
变更为 org.htmlunit:htmlunit
,包名也从 com.gargoylesoftware.htmlunit.
更新为 org.htmlunit.
。升级时,请相应调整构建配置和代码导入。
Selenium HtmlUnit 已更新至 4.22。本次升级中,依赖坐标从 org.seleniumhq.selenium:htmlunit-driver
变更为 org.seleniumhq.selenium:htmlunit3-driver
。升级时,请相应调整构建配置。
为了更快的启动时间和更高效的 WebJars 资源解析,你需要在构建文件(如 pom.xml)中将依赖从 org.webjars:webjars-locator-core
更新为 org.webjars:webjars-locator-lite
。这两项依赖由 Spring Boot 统一管理。需要注意,Spring 对 org.webjars:webjars-locator-core
的支持已被弃用,并将在未来版本中移除。有关详细信息,请参阅 参考文档的相关章节。
Spring Boot 不再直接依赖 OkHttp,因此也不再对其版本进行管理。如果你的应用程序包含 OkHttp 依赖,请更新构建以选择适合需求的 OkHttp 版本。
Spring Boot 3.4 使用的 Netty 版本尚未完全被 Native Build Tools 提供的 GraalVM 可达性元数据支持。要在原生镜像中正常使用 Netty,需手动升级 GraalVM 可达性元数据版本。
对于 Maven:
org.graalvm.buildtools
native-maven-plugin
0.3.14
@MockBean
和 @SpyBean
注解已被弃用,建议使用 Spring Framework 提供的 @MockitoBean
和 @MockitoSpyBean
。新的注解功能与 Spring Boot 提供的注解功能并不完全一致。例如,@MockitoBean
尚不支持在 @Configuration
类中使用,你可能需要在测试类中直接注解字段。
Spring Boot 3.2 中标记为弃用并计划在 3.4 中移除的类、方法和属性现已被移除。在升级之前,请确保没有调用这些弃用的功能。
新增了对结构化日志的支持,包括 Elastic Common Schema(ecs
)、Graylog 扩展日志格式(gelf
)和 Logstash(logstash
)的内置支持。可以通过设置 logging.structured.format.file
为 ecs
、gelf
或 logstash
来启用结构化文件日志记录。类似地,可以通过设置 logging.structured.format.console
来启用结构化控制台日志记录。
有关更多信息,包括如何定义自定义格式,请参阅参考文档。
@Fallback
Bean@ConditionalOnSingleCandidate
现在支持 @Fallback
Bean。如果存在一个主 Bean,或者没有主 Bean 但存在一个非回退的单一候选 Bean,则该条件会匹配。
在类型匹配时,基于 Bean 的条件现在会忽略非默认候选 Bean。通过声明某个 Bean 为非默认候选(使用 @Bean(defaultCandidate=false)
),现在可以定义一个特定类型的 Bean,而不会导致相同类型的自动配置 Bean 退出。这简化了配置,例如在同一个应用程序中使用 两个 DataSource
Bean 或 两个 EntityManagerFactory
Bean。
新增了 ClientHttpRequestFactoryBuilder
接口,可以为特定技术创建 ClientHttpRequestFactory
实例。构建器支持对底层组件进行细粒度自定义,并提供一致的方式来应用通用设置。
以下构
建器可以通过接口的静态工厂方法创建:
ClientHttpRequestFactoryBuilder.httpComponents()
)ClientHttpRequestFactoryBuilder.jetty()
)HttpClient
(ClientHttpRequestFactoryBuilder.reactor()
)HttpClient
(ClientHttpRequestFactoryBuilder.jdk()
)HttpURLConnection
(ClientHttpRequestFactoryBuilder.simple()
)有关更多详细信息,包括如何通过配置属性应用通用设置,请参阅参考文档。
新增了 spring.application.group
属性,用于对应用程序进行分组,例如将属于某个业务部门的多个应用程序归类。当设置此属性时,它也会出现在日志消息中。此行为可通过 logging.include-application.group
属性控制。应用程序分组信息还会自动添加到 OpenTelemetry 的 Resource
中。
支持通过 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
属性,可用于更细粒度地启用或禁用跟踪导出。
当类路径中存在 AssertJ 时,将自动配置 MockMvcTester
。MockMvcTester
提供了一种流畅的 API,用于定义请求和断言。它可以在任何可以注入 MockMvc
的地方使用。
有关更多详细信息,请参阅 Spring Framework 参考文档的专用章节。
Spring Boot 现在提供了配置默认租户和命名空间的属性。这些默认值适用于主题 URL 未完全限定时生产或消费消息的情况。可以通过 spring.pulsar.defaults.topic.tenant
和 spring.pulsar.defaults.topic.namespace
配置这些属性,或者定义自己的 PulsarTopicBuilder
bean。如果需要禁用默认值,将 spring.pulsar.defaults.topic.enabled=false
。
新增了 PulsarContainerFactoryCustomizer
接口,用于自定义自动配置的 PulsarContainerFactory
。
spring.pulsar.consumer.subscription.name
配置属性现在应用于自动配置的 Pulsar 监听器容器。
引入了两个用于配置 Pulsar 客户端并发性的属性:
spring.pulsar.client.threads.io
:控制用于处理与代理连接的线程数。spring.pulsar.client.threads.listener
:控制用于消息监听器的线程数。此外,新属性 spring.pulsar.listener.concurrency
可控制自动配置的 Pulsar 消息监听器容器的并发性。
Couchbase 集群现在支持通过客户端证书进行身份验证,作为用户名和密码身份验证的替代方案。详细信息请参阅参考文档。
FreeMarker 变量现可通过定义一个或多个类型为 FreeMarkerVariablesCustomizer
的 bean 来自定义。自定义器将按定义的顺序(如果有)依次调用。
由于 ActiveMQ Classic 重新支持嵌入式 Broker,自动配置已更新以支持此功能。
需要注意,与 Spring Boot 2.7.x 不同,ActiveMQ starter 仅限于客户端。如果需要使用嵌入式 Broker,需要将 org.apache.activemq:activemq-broker
添加到应用程序中。
注解处理器现在支持检测 Enum
类型的默认值。如果你为自定义属性手动添加了元数据来提供默认值,请确保将其移除。
为简化自动配置的演进,Spring Boot 引入了对自动配置类的弃用和替换支持。替换可以在新的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.replacements
文件中声明。更多详情请参阅参考文档。
如果启用了虚拟线程,以下组件将默认使用虚拟线程:
OtlpMeterRegistry
Spring Boot 默认使用 paketobuildpacks/builder-jammy-java-tiny
构建器。此构建器原生支持 ARM 和 x64 平台。
Maven插件新增了 trustBuilder
选项,用于控制 CNB 生命周期的调用方式,以提高安全性。默认信任的构建器包括 Paketo 项目、Heroku 和 Google 的构建器。详情请参阅 Maven文档。
新增的 imagePlatform
选项允许为不同于主机平台的操作系统和架构构建镜像,前提是主机平台支持模拟其他系统(
例如,使用 Apple Silicon 的 Mac 上的 Rosetta 模拟 AMD 架构)。详情请参阅 Maven文档。
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
容器镜像,添加了对 Redis Stack 和 Redis Stack Server 的支持。grafana/otel-lgtm
容器镜像,添加了对 Grafana LGTM 的支持。HazelcastConnectionDetails
)。org.testcontainers.kafka.KafkaContainer
的支持。redis/redis-stack
和 redis/redis-stack-server
容器镜像,添加了对 Redis Stack 和 Redis Stack Server 的支持。org.testcontainers.grafana.LgtmStackContainer
的支持。HazelcastConnectionDetails
)。RedisContainer
的支持。现在可以扩展 Spring Boot,以可插拔的方式暴露 actuator 端点。可以实现新的 EndpointExposureOutcomeContributor
接口来影响 @ConditionalOnAvailableEndpoint
条件。
这个扩展应该使得提供类似我们现有的 Cloud Foundry 支持的额外平台集成变得更加容易。
如果您使用的是 SSL 包,现在有一个新端点显示 SSL 信息(有效期、发行者、主题等),可在 /actuator/info
下获取。该端点还会显示即将过期的证书,以提醒您需要尽快轮换证书。新增了名为 management.health.ssl.certificate-validity-warning-threshold
的配置属性来配置阈值。
还添加了一个新的健康检查来监控 SSL 证书。如果证书无效,它将状态设置为 OUT_OF_SERVICE
。
/actuator/scheduledtasks
端点中的额外信息/scheduledtasks
Actuator 端点 现在公开了有关计划任务的额外元数据,例如 "下一次预定执行时间" 和 "上次执行时间、状态和异常"。
Spring Boot 3.4 迁移到了几个 Spring 项目的新版:
许多第三方依赖项也已更新,其中一些更值得注意的包括:
除了上述变化外,还包括许多小的调整和改进:
Customizer
bean 在使用 Liquibase 之前对其进行自定义。JCachePropertiesCustomizer
bean 来自定义用于创建 JCache CacheManager
的属性。viewNameTranslator
的 bean 来自定义 Spring MVC 使用的 RequestToViewNameTranslator
。LettuceClientOptionsBuilderCustomizer
bean 来自定义 Lettuce 的 ClientOptions
。对于整个 LettuceClientConfiguration
的更广泛配置,继续使用 LettuceClientConfigurationBuilderCustomizer
。ProxyConnectionFactoryCustomizer
来自定义 R2DBC 的 ProxyConnectionFactory
。spring.mail.ssl.*
通过 SSL 包配置 JavaMailSender
上的 TLS。spring.gson.strictness
属性配置 GSON 的严格性。@Name
来自定义其名称。DataSource
派生时,DataSourceBuilder
现在可以使用源 DataSource 的 URL 确定驱动程序类名称,如果它不公开驱动程序类名称。spring.application.version
读取和设置应用程序版本。属性的默认值取自清单中的 Implementation-Version
。EntityManagerFactoryBuilder
也定义了原生(例如 Hibernate)属性。@EnableScheduling
,Spring Integration 的 TaskScheduler
现在也支持虚拟线程。@ConditionalOnAvailableEndpoint
现在有一个 value
别名用于 endpoint
。spring.data.web.pageable.serialization-mode
,用于配置 Spring Data Web 的序列化模式。SpringApplication.from(…)
语法时,现在可以指定要激活的额外配置文件。BP_NATIVE_IMAGE: true
。@ConfigurationProperties
beans 现在尊重 @DependsOn
、@Description
、@Fallback
、@Lazy
、@Primary
、@Scope
和 @Role
注解。MultiFormatStringBuilderFormattable
在结构化日志中。spring.jms.listener.max-messages-per-task
,用于配置监听器在单个任务中处理的最大消息数。EndpointRequest
类现在提供了 toAdditionalPaths(…)
方法。server.jetty.max-form-keys
属性,用于自定义 Jetty 的最大表单键。management.otlp.logging.connect-timeout
和 management.otlp.tracing.connect-timeout
以配置与 OTLP 收集器的连接超时。--enable-sbom=sbom
构建原生镜像,现在会自动检测到这个 SBOM。DatabaseDriver
枚举现在支持 ClickHouse JDBC 驱动程序。management.logging.export.enabled
management.otlp.logging.export.enabled
禁用日志导出。
@BatchTaskExectuor
注解的 TaskExecutor
bean 来自定义 Spring Batch 使用的 TaskExecutor
。indexed
存储库类型。HikariCheckpointRestoreLifecycle
现在会记录一条警告。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..enabled
,改用 management.endpoints.access.default
和 management.endpoint..access
。@Endpoint
上的 enableByDefault
,改用 defaultAccess
。关注我,紧跟本系列专栏文章,咱们下篇再续!
作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。
各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。
负责:
- 中央/分销预订系统性能优化
- 活动&券等营销中台建设
- 交易平台及数据中台等架构和开发设计
- 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
- LLM Agent应用开发
- 区块链应用开发
- 大数据开发挖掘经验
- 推荐系统项目
目前主攻市级软件项目设计、构建服务全社会的应用系统。
参考:
本文由博客一文多发平台 OpenWrite 发布!
参与评论
手机查看
返回顶部