Spring Boot 3.4 正式发布,结构化日志!
1 从 Spring Boot 3.3 晋级到 3.4
1.1 RestClient 和 RestTemplate
新增对 RestClient
和 RestTemplate
主动装备的支撑,可用 Reactor Netty 的 HttpClient
或 JDK 的 HttpClient
。支撑的客户端优先级:
- Apache HTTP Components (
HttpComponentsClientHttpRequestFactory
) - Jetty Client (
JettyClientHttpRequestFactory
) - Reactor Netty 的
HttpClient
(ReactorClientHttpRequestFactory
) - JDK 的
HttpClient
(JdkClientHttpRequestFactory
) - 简略的 JDK
HttpURLConnection
(SimpleClientHttpRequestFactory
)
若类途径没有 HTTP 客户端库,默许或许用 JdkClientHttpRequestFactory
,而非之前的 SimpleClientHttpRequestFactory
。能够经过设置 spring.http.client.factory
来挑选特定客户端,支撑的值包含 http-components
、jetty
、reactor
、jdk
和 simple
。
一切五个客户端默许会遵从重定向。如需禁用此行为,能够将 spring.http.client.redirects
设置为 dont-follow
。
1.2 Apache HTTP Components 和 Envoy
Apache HTTP Components 的 HttpClient
在 HTTP/1.1 的 TLS 晋级默许行为有所改动。尽管大多数署理服务器能够正确处理晋级,但运用 Envoy 或 Istio 时或许会遇到问题。
假如需求康复曾经的行为,可用新的 ClientHttpRequestFactoryBuilder
。界说一个 HttpComponentsClientHttpRequestFactoryBuilder
并按以下办法自界说:
@Bean
public HttpComponentsClientHttpRequestFactoryBuilder httpComponentsClientHttpRequestFactoryBuilder() {
return ClientHttpRequestFactoryBuilder.httpComponents()
.withDefaultRequestConfigCustomizer((builder) -> builder.setProtocolUpgradeEnabled(false));
}
1.3 装备特点的 Bean 验证
之前,当一个 @ConfigurationProperties
类标示了 @Validated
并经过 Bean Validation(如 Hibernate Validator)完成进行验证时,其嵌套特点会在绑守时被验证,不管是否运用 @Valid
。
Spring Boot 3.4 开端,验证行为与 Bean Validation 标准共同。验证从 @ConfigurationProperties
注解的类开端,并仅在嵌套特点对应的字段标示了 @Valid
时才进行级联验证。
晋级时,请查看运用了 Bean Validation 束缚的 @ConfigurationProperties
类,并在需求对嵌套特点进行级联验证的当地增加 @Valid
。
1.4 根据 Bean 的条件
@ConditionalOnBean
和 @ConditionalOnMissingBean
在 @Bean
办法中运用并设置了 annotation
特点时,其行为有所更改。两者依然默许运用 @Bean
办法的回来类型作为匹配的默许类型。但是,从 Spring Boot 3.4 开端,假如设置了 annotation
,此默许值将不会被运用。假如需求康复曾经的行为,请一起指定一个与 @Bean
办法回来类型共同的 value
和 annotation
。
1.5 高雅关机
嵌入式 Web 服务器(Jetty、Reactor Netty、Tomcat 或 Undertow)的高雅关机功用现已默许启用。如需康复之前的当即关机行为, server.shutdown
置 immediate
。
1.6 Paketo Tiny Builder 用于构建 OCI 镜像
在运用 Maven 的 spring-boot:build-image
方针为 JVM 运用程序构建 OCI 镜像时,默许的 Cloud Native Buildpacks 构建器已从 paketobuildpacks/builder-jammy-base
更改为 paketobuildpacks/builder-jammy-java-tiny
。这将生成更小的镜像。但因为 tiny
构建器不包含 shell,因而或许无法适用于需求经过发动脚本运转的运用程序。有关自界说构建器的详细信息,请参阅 Maven 文档。
1.7 运用 Testcontainers 界说动态特点
经过将 DynamicPropertyRegistry
注入到 @Bean
办法中来界说动态特点的功用已被弃用,现在默许会导致失利。代替办法是完成一个独自的 @Bean
办法,回来一个 DynamicPropertyRegistrar
,此办法应注入特点值来历的容器。这种办法处理了一些容器生命周期问题,并保证特点值来历的容器在特点被运用之前现已发动。
假如仍期望注入 DynamicPropertyRegistry
(需承担或许的生命周期问题),能够将 spring.testcontainers.dynamic-property-registry-injection
设置为 warn
或 allow
。前者会记载正告但答应注入,后者则会彻底康复 Spring Boot 3.3 的行为。
1.8 @AutoConfigureTestDatabase 与容器的集成
@AutoConfigureTestDatabase
注解现在会主动检测数据库是否来历于容器。假如是,则无需再增加 replace=Replace.NONE
。
如需康复古的行为,能够在注解中设置 replace=Replace.AUTO_CONFIGURED
。
1.9 操控 Actuator 端点的拜访权限
启用和禁用端点的支撑已被从头规划,替换为更细粒度的拜访操控模型。新的模型不只支撑禁用端点(拜访等级为 none
)和彻底启用端点(拜访等级为 unrestricted
),还支撑只答应端点操作的“只读”拜访(拜访等级为 read-only
)。
以下特点已被弃用:
management.endpoints.enabled-by-default
management.endpoint.<id>.enabled
其代替特点为:
management.endpoints.access.default
management.endpoint.<id>.access
相同,@Endpoint
注解中的 enableByDefault
特点已被弃用,新的 defaultAccess
特点代替了它。
作为更改的一部分,enabled-by-default
的运用现在愈加共同,并与是否运用了 @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
,则日志记载端点仅答应只读拜访。
1.10 Cloud Foundry 中 @ConditionalOnAvailableEndpoint 露出的更改
在运用 @ConditionalOnAvailableEndpoint
注解时,本来运用的枚举值 EndpointExposure.CLOUD_FOUNDRY
已被弃用,主张改用 EndpointExposure.WEB
。关于典型的 Spring Boot 运用,这一更改一般不会有影响。但假如你界说了自界说的 Cloud Foundry 特定 Actuator 端点 bean,则需求将条件更新为运用 EndpointExposure.WEB
。
1.11 HtmlUnit 4.3
HtmlUnit 已晋级至 4.3。本次晋级中,依靠坐标从 net.sourceforge.htmlunit:htmlunit
变更为 org.htmlunit:htmlunit
,包名也从 com.gargoylesoftware.htmlunit.
更新为 org.htmlunit.
。晋级时,请相应调整构建装备和代码导入。
1.12 Selenium HtmlUnit 4.22
Selenium HtmlUnit 已更新至 4.22。本次晋级中,依靠坐标从 org.seleniumhq.selenium:htmlunit-driver
变更为 org.seleniumhq.selenium:htmlunit3-driver
。晋级时,请相应调整构建装备。
1.13 WebJars 定位器集成
为了更快的发动时刻和更高效的 WebJars 资源解析,你需求在构建文件(如 pom.xml)中将依靠从 org.webjars:webjars-locator-core
更新为 org.webjars:webjars-locator-lite
。这两项依靠由 Spring Boot 统一办理。需求留意,Spring 对 org.webjars:webjars-locator-core
的支撑已被弃用,并将在未来版别中移除。有关详细信息,请参阅 参阅文档的相关章节。
1.14 OkHttp 依靠办理的移除
Spring Boot 不再直接依靠 OkHttp,因而也不再对其版别进行办理。假如你的运用程序包含 OkHttp 依靠,请更新构建以挑选合适需求的 OkHttp 版别。
1.15 原生镜像中的 Netty
Spring Boot 3.4 运用的 Netty 版别没有彻底被 Native Build Tools 供给的 GraalVM 可达性元数据支撑。要在原生镜像中正常运用 Netty,需手动晋级 GraalVM 可达性元数据版别。
关于 Maven:
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
<metadataRepository>
<version>0.3.14</version>
</metadataRepository>
</configuration>
</plugin>
1.16 @MockBean 和 @SpyBean 的弃用
@MockBean
和 @SpyBean
注解已被弃用,主张运用 Spring Framework 供给的 @MockitoBean
和 @MockitoSpyBean
。新的注解功用与 Spring Boot 供给的注解功用并不彻底共同。例如,@MockitoBean
尚不支撑在 @Configuration
类中运用,你或许需求在测验类中直接注解字段。
1.17 Spring Boot 3.2 的弃用项
Spring Boot 3.2 中标记为弃用并计划在 3.4 中移除的类、办法和特点现已被移除。在晋级之前,请保证没有调用这些弃用的功用。
1.18 最低要求更改
2 新功用和亮点
2.1 结构化日志
新增了对结构化日志的支撑,包含 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 为非默许候选(运用 @Bean(defaultCandidate=false)
),现在能够界说一个特定类型的 Bean,而不会导致相同类型的主动装备 Bean 退出。这简化了装备,例如在同一个运用程序中运用 两个 DataSource
Bean 或 两个 EntityManagerFactory
Bean。
ClientHttpRequestFactory 构建器
新增了 ClientHttpRequestFactoryBuilder
接口,能够为特定技能创立 ClientHttpRequestFactory
实例。构建器支撑对底层组件进行细粒度自界说,并供给共同的办法来运用通用设置。
以下构
建器能够经过接口的静态工厂办法创立:
- Apache HTTP Components(
ClientHttpRequestFactoryBuilder.httpComponents()
) - Jetty Client(
ClientHttpRequestFactoryBuilder.jetty()
) - Reactor Netty 的
HttpClient
(ClientHttpRequestFactoryBuilder.reactor()
) - JDK 的
HttpClient
(ClientHttpRequestFactoryBuilder.jdk()
) - 简略的 JDK
HttpURLConnection
(ClientHttpRequestFactoryBuilder.simple()
)
有关更多详细信息,包含怎么经过装备特点运用通用设置,请参阅参阅文档。
可调查性改善
运用程序分组
新增了 spring.application.group
特点,用于对运用程序进行分组,例如将归于某个业务部门的多个运用程序归类。当设置此特点时,它也会出现在日志音讯中。此行为可经过 logging.include-application.group
特点操控。运用程序分组信息还会主动增加到 OpenTelemetry 的 Resource
中。
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
特点,可用于更细粒度地启用或禁用盯梢导出。
对 MockMvc 的 AssertJ 支撑
当类途径中存在 AssertJ 时,将主动装备 MockMvcTester
。MockMvcTester
供给了一种流通的 API,用于界说请求和断语。它能够在任何能够注入 MockMvc
的当地运用。
有关更多详细信息,请参阅 Spring Framework 参阅文档的专用章节。
Spring Pulsar
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 身份验证
Couchbase 集群现在支撑经过客户端证书进行身份验证,作为用户名和暗码身份验证的代替计划。详细信息请参阅参阅文档。
FreeMarker
FreeMarker 变量现可经过界说一个或多个类型为 FreeMarkerVariablesCustomizer
的 bean 来自界说。自界说器将按界说的次序(假如有)顺次调用。
嵌入式 ActiveMQ Classic Broker 的支撑
因为 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
- Undertow Web 服务器
镜像构建改善
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 现在支撑多个 Docker Compose 装备文件。
指令行参数
新特点 spring.docker.compose.start.arguments
和 spring.docker.compose.stop.arguments
能够用来指定在发动和中止服务时传递给 Docker Compose 子指令的额定指令行参数。新增了 spring.docker.compose.arguments
特点,用于向 Docker Compose 传递参数。
更新支撑
- Postgres
POSTGRES_HOST_AUTH_METHOD=trust
环境变量 现在被支撑。 - 经过别离运用
redis/redis-stack
和redis/redis-stack-server
容器镜像,增加了对 Redis Stack 和 Redis Stack Server 的支撑。 - 经过运用
grafana/otel-lgtm
容器镜像,增加了对 Grafana LGTM 的支撑。 - 增加了对 Hazelcast 的支撑(运用
HazelcastConnectionDetails
)。 - 增加了对 OTLP 日志记载的支撑。
Testcontainers 改善
- 增加了对
org.testcontainers.kafka.KafkaContainer
的支撑。 - 经过别离运用
redis/redis-stack
和redis/redis-stack-server
容器镜像,增加了对 Redis Stack 和 Redis Stack Server 的支撑。 - 增加了对
org.testcontainers.grafana.LgtmStackContainer
的支撑。 - 增加了对 Hazelcast 的支撑(运用
HazelcastConnectionDetails
)。 - 增加了对 OTLP 日志记载的支撑。
- 增加了对
RedisContainer
的支撑。
Actuator
可插拔的 Actuator 露出器
现在能够扩展 Spring Boot,以可插拔的办法露出 actuator 端点。能够完成新的 EndpointExposureOutcomeContributor
接口来影响 @ConditionalOnAvailableEndpoint
条件。
这个扩展应该使得供给相似咱们现有的 Cloud Foundry 支撑的额定渠道集成变得愈加简单。
SSL 信息和健康查看
假如您运用的是 SSL 包,现在有一个新端点显现 SSL 信息(有效期、发行者、主题等),可在 /actuator/info
下获取。该端点还会显现行将过期的证书,以提醒您需求赶快轮换证书。新增了名为 management.health.ssl.certificate-validity-warning-threshold
的装备特点来装备阈值。
还增加了一个新的健康查看来监控 SSL 证书。假如证书无效,它将状况设置为 OUT_OF_SERVICE
。
/actuator/scheduledtasks
端点中的额定信息
/scheduledtasks
Actuator 端点 现在揭露了有关计划使命的额定元数据,例如 "下一次预订执行时刻" 和 "前次执行时刻、状况和反常"。
3 依靠晋级
Spring Boot 3.4 搬迁到了几个 Spring 项目的新版:
- Spring AMQP 3.2
- Spring Authorization Server 1.4
- Spring Batch 5.2
- Spring Data 2024.1
- Spring Framework 6.2
- Spring HATEOAS 2.4
- Spring Integration 6.4
- Spring Kafka 3.3
- Spring Pulsar 1.2
- Spring Security 6.4
- Spring Session 3.4
许多第三方依靠项也已更新,其间一些更值得留意的包含:
- Apache Http Client 5.4
- AssertJ 3.26
- Artemis 2.37
- Elasticsearch Client 8.15
- Flyway 10.20
- Gson 2.11
- Hibernate 6.6
- HtmlUnit 4.5.0
- JUnit Jupiter 5.11
- Jackson 2.18.0
- Jedis 5.2
- Kafka 3.8
- Lettuce 6.4
- Liquibase 4.29
- Log4j 2.24
- HtmlUnit 4.3
- MariaDB 3.4
- Micrometer 1.14
- Micrometer Tracing 1.4
- Mockito 5.13
- MongoDB 5.2.0
- MySQL 9.1
- OpenTelemetry 1.41
- Oracle Database 23.4
- R2DBC MySQL 1.3
- Rabbit AMQP Client 5.22
- Rabbit Stream Client 0.18.0
- Reactor 2024.0
- Selenium 4.25
- Testcontainers 1.20.3
- XMLUnit 2.10
杂项
除了上述变化外,还包含许多小的调整和改善:
- 现在能够运用
Customizer<Liquibase>
bean 在运用 Liquibase 之前对其进行自界说。 - 现在能够经过界说
JCachePropertiesCustomizer
bean 来自界说用于创立 JCacheCacheManager
的特点。 - 现在能够经过界说名为
viewNameTranslator
的 bean 来自界说 Spring MVC 运用的RequestToViewNameTranslator
。 - 现在能够运用
LettuceClientOptionsBuilderCustomizer
bean 来自界说 Lettuce 的ClientOptions
。关于整个LettuceClientConfiguration
的更广泛装备,持续运用LettuceClientConfigurationBuilderCustomizer
。 - 能够运用新的自界说器
ProxyConnectionFactoryCustomizer
来自界说 R2DBC 的ProxyConnectionFactory
。 - 假如产生 Spring Security 刊出,现在会发布一个审计事情。
- 现在能够运用新的特点
spring.mail.ssl.*
经过 SSL 包装备JavaMailSender
上的 TLS。 - 现在能够运用新的
spring.gson.strictness
特点装备 GSON 的严厉性。 - 现在能够在 JavaBean 风格的装备特点的字段上运用
@Name
来自界说其称号。 - 当从另一个
DataSource
派生时,DataSourceBuilder
现在能够运用源 DataSource 的 URL 确认驱动程序类称号,假如它不揭露驱动程序类称号。 - 安排妥当和存活健康探针 现在在 Cloud Foundry 渠道上主动启用。
- 能够运用新特点
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(…)
语法时,现在能够指定要激活的额定装备文件。 - Spring Boot 插件不再在构建包环境中设置
BP_NATIVE_IMAGE: true
。 - 注册的
@ConfigurationProperties
beans 现在尊重@DependsOn
、@Description
、@Fallback
、@Lazy
、@Primary
、@Scope
和@Role
注解。 - 现在支撑 Log4j2 的
MultiFormatStringBuilderFormattable
在结构化日志中。 - 增加了一个新的装备特点
spring.jms.listener.max-messages-per-task
,用于装备监听器在单个使命中处理的最大音讯数。 - 默许的安全装备现在露出了映射到附加途径的健康组。此外,两个
EndpointRequest
类现在供给了toAdditionalPaths(…)
办法。 - 现在能够经过特点设置会话 cookie 的分区特点。
- 增加了一个新的
server.jetty.max-form-keys
特点,用于自界说 Jetty 的最大表单键。 - 增加了新的特点
management.otlp.logging.connect-timeout
和management.otlp.tracing.connect-timeout
以装备与 OTLP 收集器的衔接超时。 - 增加了经过 OTLP 传输日志时的 gRPC 传输支撑。
- 假如在构建过程中绑定了容器中运用的目录,现在会显现正告。
- 假如运用
--enable-sbom=sbom
构建原生镜像,现在会主动检测到这个 SBOM。 DatabaseDriver
枚举现在支撑 ClickHouse JDBC 驱动程序。- 能够运用新特点
management.logging.export.enabled
- 和
management.otlp.logging.export.enabled
禁用日志导出。- 能够经过界说带有
@BatchTaskExectuor
注解的TaskExecutor
bean 来自界说 Spring Batch 运用的TaskExecutor
。 - Spring Session 主动装备现在支撑呼应式 Web 运用程序中的
indexed
存储库类型。 - 假如未装备池挂起而且创立了查看点,
HikariCheckpointRestoreLifecycle
现在会记载一条正告。
- 能够经过界说带有
3.4 版别 Spring Boot 的弃用
- 弃用
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.SpringA