您现在的位置是:首页 > 文章详情

Spring Boot 3.4 正式发布

日期:2024-12-02点击:245

Spring Boot 3.4 已正式发布。

从 Spring Boot 3.3 升级

Rest Client和 RestTemplate

已添加对自动配置RestClientRestTemplate以使用_Reactor Netty_的HttpClient或_JDK_的HttpClient的支持。按优先顺序,现在支持的 客户端如下:

  • Apache HTTP Components(HttpComponentsClientHttpRequestFactory
  • Jetty Client (JettyClientHttpRequestFactory
  • Reactor NettyHttpClientReactorClientHttpRequestFactory
  • JDKHttpClientJdkClientHttpRequestFactory
  • Simple JDKHttpURLConnectionSimpleClientHttpRequestFactory

需要注意的是,如果类路径上没有_HTTP_Client 库,就可能会使用JdkClientHttpRequestFactory,而之前使用的是SimpleClientHttpRequestFactory。可以通过设置spring.http.client.factory来选择特定的客户端。支持的值包括http-componentsjettyreactorjdksimple

默认情况下,所有五个客户端都会自动跟随重定向。要禁用此行为,可将spring.http.client.redirects设置为dont-follow

Apache HTTP Components 和 Envoy

Apache HTTP Components(组件)更改了HttpClient中有关_HTTP/1.1 TLS_升级的默认设置。大多数代理服务器都能顺利处理升级,但_Envoy_或_Istio_可能会遇到问题。

如果需要恢复以前的行为,可以使用新的ClientHttpRequestFactoryBuilder定义一个HttpComponentsClientHttpRequestFactoryBuilder并应用以下自定义设置:

 @Bean public HttpComponentsClientHttpRequestFactoryBuilder httpComponentsClientHttpRequestFactoryBuilder() { return ClientHttpRequestFactoryBuilder.httpComponents() .withDefaultRequestConfigManagerCustomizer((builder) -> builder.setProtocolUpgradeEnabled(false)); } 

配置 Bean 的属性 验证

在之前的版本中,当使用@Validated注解的@ConfigurationProperties类通过诸如_Hibernate Validator_这样的 Bean Validation 实现进行验证时,会在绑定时对嵌套属性进行验证,而不管是否使用了@Valid。在_ Spring Boot3.4_版本中,现在验证遵循 Bean Validation 规范的行为。验证是从@ConfigurationProperties注解的类开始进行的,只有在相应字段使用@Valid注解时,验证才会级联到嵌套属性。

升级时,检查带有 Bean 验证约束的@ConfigurationProperties类。在需要验证层级联嵌套属性的地方添加@Valid

基于 Bean 的条件

@ConditionalOnBean@ConditionalOnMissingBean@Bean方法上使用时的行为发生了变化,当设置了注解属性时。与以前一样,这两个条件都将使用@Bean方法的返回类型作为要匹配的类型的默认值。在以前,如果设置了nametypevalue,则不会使用此默认值。从_Spring Boot 3.4_开始,如果设置了annotation(注解),也不会使用此默认值。要恢复先前的行为,请同时指定一个value(值),该值是@Bean方法的返回类型,以及annotation(注解)。

优雅停机

嵌入式 Web 服务器(Jetty、Rector Netty、Tomcat 或 Undertow)的优雅关机现在已默认启用。如果需要恢复以前的行为,可将server.shutdown设置为immediate

用于构建 OCI 镜像的 Paketo Tiny Builder

使用 Mavenspring-boot:build-imageGoal 或 GradlebootBuildImageTask 为 JVM 应用构建 OCI 镜像时使用的默认_Cloud Native Buildpacks_Builder 已从paketobuildpacks/builder-jammy-base更改为paketobuildpacks/builder-jammy-java-tiny。这将使镜像更小。tinyBuilder 不包含_shell_,因此可能不适用于需要启动脚本来运行程序的 应用。有关自定义 Builder 的信息,请参阅MavenGradle文档。

Testcontainer 和动态属性

通过注入DynamicPropertyRegistry来定义动态属性的支持已被弃用,现在尝试这样做将默认失败。与其注入DynamicPropertyRegistry,不如实现一个单独的@Bean方法来返回DynamicPropertyRegistrar。这个单独的 Bean 方法应注入将从中获取属性值的容器。这样可以解决一些容器生命周期问题,并确保在使用属性之前,已经启动了获取属性值的容器。

如果希望继续注入DynamicPropertyRegistry(可能会遇到上述生命周期问题),可将spring.testcontainers.dynamic-property-registry-injection设置为warnallow。前者将记录警告日志,同时允许使用注入的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-default
  • management.endpoint.<id>.enabled

替代属性为:

  • management.endpoints.access.default
  • management.endpoint.<id>.access

同样,@Endpoint上的enableByDefault属性已被弃用,取而代之的是一个新的defaultAccess属性。

作为这些更改的一部分,无论使用@ConditionalOnEnabledEndpoint与否,默认启用现在都是一致应用的。如果在升级时失去了对端点的访问权限,可将management.endpoint.<id>.access设置为read-onlyunrestricted,或将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:htmlunitpackage名称从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 Formatgelf) 和_Logstash_(logstash)的内置支持,引入了对结构化日志的支持。 要启用结构化文件日志记录,可将logging.structured.format.file设置为ecselflogstash。同样,要启用结构化控制台日志,可将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:

  • Apache HTTP Components (ClientHttpRequestFactoryBuilder.httpComponents()
  • Jetty Client (ClientHttpRequestFactoryBuilder.jetty()
  • Reactor NettyHttpClientClientHttpRequestFactoryBuilder.reactor()
  • JDKHttpClientClientHttpRequestFactoryBuilder.jdk()
  • Simple JDKHttpURLConnectionClientHttpRequestFactoryBuilder.simple()

更多详情,包括如何使用配置属性应用常用设置,请参阅更新的参考文档

可观测性的改进

应用分组

新的spring.application.group属性可用于将应用分组,例如,如果它们都属于某个业务单元或一个更大的应用调度。设置该属性后,日志信息中也会包含该属性。可以使用logging.include-application.group属性控制这一行为。Application Group 也会自动添加到 OpenTelemetryResource中。

OTLP

现在可以通过_gRPC_传输发送 OTLP Span。为此,请将新的配置属性management.otlp.tracing.transport设置为grpc。该属性默认为http。服务连接支持也已添加。

management.otlp.logs下的新属性可用于自动配置OpenTelemetryOtlpHttpLogRecordExporterSdkLoggerProvider

可观测性的其他更新

ProcessInfoContributor现在还能显示有关堆和非堆使用情况的内存信息。

新的management.otlp.tracing.export.enabledmanagement.wavefront.tracing.export.enabledmanagement.zipkin.tracing.export.enabled属性现在可用于更精细地启用或禁用 Trace 导出。

AssertJ 支持 MockMvc

当 AssertJ 位于 classpath 上时,MockMvcTester会自动配置。MockMvcTester可让你使用 Fluent 风格的 API 来定义请求和断言。它可以在任何MockMvc可以使用的地方进行注入。

有关详细信息,请参阅 Spring Framework参考文档中的专门章节

Spring Pulsar

现在提供了配置属性用于配置默认的租户和命名空间。当使用未完全限定的 Topic URL 来消费或生产消息时,默认值将 应用。你可以使用spring.pulsar.defaults.topic.tenantspring.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文件中声明替换。要了解更多信息,请参阅参考文档

虚拟线程

如果启用了虚拟线程,以下组件将使用虚拟线程:

镜像构建的改进

Spring Boot 现在默认使用paketobuildpacks/builder-jammy-java-tiny。该 Builder 开箱即支持 ARM 和 x64 平台。

Maven 和 Gradle 构建 OCI 镜像的插件中新增了一个trustBuilder选项。此选项控制 CNB 生命周期的调用方式,在使用来自不受信任来源的 Builder 时提供了改进的安全性。默认情况下,来自_Paketo_项目、_Heroku_和_Google_的构建器是可信任的。有关详细信息,请参阅MavenGradle文档。

Maven 和 Gradle 构建 OCI 镜像的插件中新增了一个imagePlatform选项。此选项可用于指定任何 CNB Builder、运行时和 Buildpack 镜像的操作系统和架构,以便运行 CNB Builder。当主机平台支持模拟其他操作系统/架构(例如,在使用 Apple 芯片的 Mac 上使用 Rosetta 模拟 ARM 主机上的 AMD 架构)时,可以使用此选项为与主机平台的操作系统和架构不同的操作系统和架构构建镜像。有关更多信息,请参阅MavenGradle文档。

Docker Compose 的改进

Docker Compose 现在支持多个 Docker Compose 配置文件。

命令行参数

新属性spring.docker.compose.start.argumentsspring.docker.compose.stop.arguments可用于指定启动和停止服务时传递给 Docker Compose 子命令的附加命令行参数。新增的spring.docker.compose.arguments属性可将参数传递给 Docker Compose。

支持的更新

  • 现在支持PostgresPOSTGRES_HOST_AUTH_METHOD=trust环境变量。
  • 新增了对_Redis Stack_和_Redis Stack Server_的支持,分别使用redis/redis-stackredis/redis-stack-server容器镜像。
  • 通过grafana/otel-lgtm容器镜像新增了对Grafana LGTM的支持。
  • 新增了对_Hazelcast_的支持(使用HazelcastConnectionDetails)。
  • 新增了对 OTLP 日志的支持。

Testcontainers 改进

  • 添加了对org.testcontainers.kafka.KafkaContainer的支持。
  • 使用redis/redis-stackredis/redis-stack-server容器镜像,添加了对_Redis Stack_和_Redis Stack Server_的支持。
  • 添加了对org.testcontainers.grafana.LgtmStackContainer的支持。
  • 添加了对_Hazelcast_的支持(使用HazelcastConnectionDetails)。
  • 新增了对 OTLP 日志的支持。
  • 添加了对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
  • 新的 CustomizerProxyConnectionFactoryCustomizer可用于定制 R2DBCProxyConnectionFactory
  • 如果发生 Spring Security 注销(Logout),现在会发布审计事件。
  • 现在可使用新属性spring.mail.ssl.*配置JavaMailSender上的 TLS 与 SSL Bundle。
  • GSON 的严格程度可使用新的spring.gson.strictness属性进行配置。
  • 现在可以在 JavaBean 风格配置属性的字段上使用@Name来自定义其名称。
  • 从其他DataSource派生时,如果源数据源的 URL 没有公开驱动类名,DataSourceBuilder现在可以使用源数据源的 URL 确定驱动类名。
  • 现在,Cloud Foundry 平台可自动启用有效性和就绪性健康探针(Liveness and Readiness health probes)
  • 新属性spring.application.version可用于读取和设置 应用版本。该属性的默认值取自_manifest_的Implementation-Version
  • 自动配置的EntityManagerFactoryBuilder也定义了原生(如_Hibernate_)属性。
  • 即使未使用@EnableScheduling,Spring Integration 的TaskScheduler现在也能感知虚拟线程。
  • @ConditionalOnAvailableEndpoint现在为端点提供了一个value别名。
  • 新增了用于配置 Spring Data Web 序列化模式的配置属性spring.data.web.pageable.serialization-mode
  • 使用SpringApplication.from(...)语法时,现在可以指定要激活的额外 Profile。
  •  Spring Boot插件不再在buildpack环境中设置BP_NATIVE_IMAGE: true
  • 已注册的@ConfigurationPropertiesbean 现在尊重@DependsOn@Description@Fallback@Lazy@Primary@Scope@Role注解。
  • 结构化日志现在支持 Log4j2 的MultiFormatStringBuilderFormattable
  • 新增了一个配置属性spring.jms.listener.max-messages-per-task,用于配置监听器在一个任务中处理的消息的最大数量。
  • 默认安全配置现在公开与其他路径映射的健康组(Health Group)。此外,两个EndpointRequest类现在都提供toAdditionalPaths(...)方法。
  • Session cookie 的partitioned属性现在可以通过属性进行设置。
  • 新增了server.jetty.max-form-keys属性,用于自定义 Jetty 的最大表单 Key 值。
  • 新增了management.otlp.logging.connect-timeoutmanagement.otlp.tracing.connect-timeout属性,用于配置与 OTLP Collector 的连接超时。
  • 通过 OTLP 传输日志时,新增了对 gRPC 传输的支持。
  • 现在在容器中绑定用于构建过程中的_buildpacks_使用的目录时会显示警告。
  • 在使用--enable-sbom=sbom构建原生镜像时,现在会自动检测_SBOM_。
  • DatabaseDriver枚举现在支持 ClickHouse JDBC 驱动。
  • 新属性management.logging.export.enabledmanagement.otlp.logging.export.enabled可用于禁用日志导出。
  • Spring Batch 使用的TaskExecutor可通过定义注解为@BatchTaskExectuorTaskExecutorBean 进行自定义。
  • Spring Session 自动配置现在支持响应式 Web 应用中的indexedRepository 类型。
  • 如果未配置池暂停(Pool Suspension)并创建了检查点(Checkpoint),HikariCheckpointRestoreLifecycle将记录一个警告。

Spring Boot 3.4 中的弃用

  • spring.gson.lenient替换为spring.gson.strictness
  • @MockBean@SpyBean分别取代 Spring Framework 的@MockitoBeanMockitoSpyBean
  • 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-defaultmanagement.endpoint.<id>.enabled分别取代management.endpoints.access.defaultmanagement.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

原文链接:https://www.oschina.net/news/322949/spring-boot-3-4-released
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章