Spring Boot 3.4.0 发行:革新与突破的里程碑
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,
15年
工作经验,精通Java编程
,高并发设计
,Springboot和微服务
,熟悉Linux
,ESXI虚拟化
以及云原生Docker和K8s
,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea
Spring Boot 3.4.0 发行:革新与突破的里程碑
Spring Boot 3.4.0
于2024-11-21正式发布:
引言
本次Spring Boot 3.4.0
的发布带来了一系列令人期待和关注的重要特性,显著提升了开发体验与应用性能,本次带来的更新核心的几点如下:
一、日志与配置优化
- 结构化日志记录:支持多种格式如 ECS、GELF 和 Logstash,通过
logging.structured.format.file
与logging.structured.format.console
属性便捷开启,使日志规整有序,便于分析处理,极大助力于分布式系统的监控与问题排查。 - 配置元数据升级:注释处理器可检测
Enum
默认值,减少手动元数据配置,让配置过程更加智能高效,降低出错概率。
二、功能组件增强
- Spring Pulsar 拓展:可配置默认租户和命名空间,新增
PulsarContainerFactoryCustomizer
等接口自定义容器工厂,还能对客户端并发等进行精细调控,如设置spring.pulsar.client.threads.io
与spring.pulsar.client.threads.listener
,使 Pulsar 在应用中集成更灵活强大。 - Couchbase 身份验证多元化:除基本用户名密码方式,新增客户端证书认证,满足更高安全需求场景,为数据安全保驾护航。
- FreeMarker 变量自定义:能通过
FreeMarkerVariablesCustomizer
bean 灵活定制自动配置的 FreeMarker 的Configuration
对象使用的变量,增强模板引擎的个性化适配能力。
三、测试与可观察性提升
- 测试框架改进:
- AssertJ 对 MockMvc 支持,自动配置
MockMvcTester
,以流畅 API 定义请求和断言,注入MockMvc
处即可使用,优化测试代码编写体验。 - 测试容器方面,支持
org.testcontainers.kafka.KafkaContainer
、Redis Stack 相关容器以及org.testcontainers.grafana.LgtmStackContainer
等,拓宽测试覆盖范围。
- AssertJ 对 MockMvc 支持,自动配置
- 可观察性飞跃:
- 应用程序分组功能,
spring.application.group
属性实现应用归类,在日志和 OpenTelemetryResource
中体现,方便管理与监控资源。 - OTLP 功能拓展,支持 gRPC 传输发送跨度,
management.otlp.logs
下属性助力日志导出配置,ProcessInfoContributor
展示内存信息并新增跟踪导出控制属性,全方位提升可观察性数据管理的精细度。
- 应用程序分组功能,
四、Actuator 功能升级
- 可插拔暴露器:可扩展 Spring Boot 以灵活方式暴露 Actuator 端点,借助
EndpointExposureOutcomeContributor
接口实现,便于与不同平台集成,如类似 Cloud Foundry 支持的拓展。 - SSL 信息与健康检查:
/actuator/info
下新增 SSL 信息端点,展示有效期等内容并可预警证书过期,同时新增健康检查监控 SSL 证书状态,保障通信安全。 - 任务端点信息丰富:
/actuator/scheduledtasks
端点公开更多元数据,如下次计划执行时间和上次执行详情,便于深入了解任务执行状况。
从Spring Boot 3.3升级
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
。
Apache HTTP Components和Envoy
Apache HTTP Components在与HTTP/1.1 TLS升级相关的HttpClient
中更改了默认值。大多数代理服务器可以毫无问题地处理升级,但是,您可能会在使用Envoy或Istio时遇到问题。
如果需要恢复以前的行为,可以使用新的ClientHttpRequestFactoryBuilder
。定义一个HttpComponentsClientHttpRequestFactoryBuilder
并应用以下自定义:
@Bean
public HttpComponentsClientHttpRequestFactoryBuilder httpComponentsClientHttpRequestFactoryBuilder() {return ClientHttpRequestFactoryBuilder.httpComponents().withDefaultRequestConfigManagerCustomizer((builder) -> builder.setProtocolUpgradeEnabled(false));
}
配置属性的Bean验证
以前,当使用Hibernate Validator等Bean验证实现验证带有@Validated
注释的@ConfigurationProperties
类时,无论是否使用@Valid
,都会在绑定嵌套属性时执行验证。在Spring Boot 3.4中,验证现在遵循Bean验证规范的行为。验证从带有@ConfigurationProperties
注释的类开始,并且仅在相应字段带有@Valid
注释时才级联到嵌套属性。
升级时,请检查带有Bean验证约束的@ConfigurationProperties
类。在需要验证级联到嵌套属性的地方添加@Valid
。
基于Bean的条件
在@Bean
方法上使用@ConditionalOnBean
和@ConditionalOnMissingBean
并且设置了annotation
属性时,其行为已更改。和以前一样,这两个条件都将使用@Bean
方法的返回类型作为要匹配的类型的默认值。以前,如果设置了name
、type
或value
,则不使用此默认值。从Spring Boot 3.4开始,如果设置了annotation
,也不会使用此默认值。要恢复以前的行为,请同时指定value
(即@Bean
方法的返回类型)和annotation
。
优雅停机
嵌入式Web服务器(Jetty、Reactor Netty、Tomcat或Undertow)的优雅停机现在默认启用。如果需要恢复以前的行为,请将server.shutdown
设置为immediate
。
用于构建OCI镜像的Paketo tiny Builder
使用Maven spring-boot:build-image
目标或Gradle bootBuildImage
任务为JVM应用程序构建OCI镜像时,默认使用的Cloud Native Buildpacks构建器已从paketobuildpacks/builder-jammy-base
更改为paketobuildpacks/builder-jammy-java-tiny
。这应该会生成更小的镜像。tiny
构建器不包括外壳,因此对于需要启动脚本来运行应用程序的应用程序可能不起作用。有关自定义构建器的信息,请参阅Maven或Gradle文档。
带有Testcontainers的动态属性
通过注入DynamicPropertyRegistry
定义动态属性的支持已被弃用,并且现在默认情况下尝试这样做会失败。不要注入DynamicPropertyRegistry
,而是实现一个单独的返回DynamicPropertyRegistrar
的@Bean
方法。这个单独的bean方法应该注入将从中获取属性值的容器。这解决了一些容器生命周期问题,并确保在使用属性之前,从中获取属性值的容器已经启动。
如果希望继续注入DynamicPropertyRegistry
(冒着遇到上述生命周期问题的风险),请将spring.testcontainers.dynamic-property-registry-injection
设置为warn
或allow
。前者将记录警告,同时允许使用注入的DynamicPropertyRegistry
。后者将默默地允许使用注入的DynamicPropertyRegistry
,完全恢复Spring Boot 3.3的行为。
@AutoConfigureTestDatabase
与容器
@AutoConfigureTestDatabase
注释现在尝试检测数据库是否来自容器。如果要将该注释与容器数据库一起使用,这应该消除添加replace=Replace.NONE
的需要。
如果需要恢复旧行为,请在注释上设置replace=Replace.AUTO_CONFIGURED
。
控制对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
,则仅允许对日志记录器端点进行只读访问。
Cloud Foundry条件端点暴露
与@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
,包名从com.gargoylesoftware.htmlunit
更改为org.htmlunit
。升级时,请相应地更新构建配置和导入。
Selenium HtmlUnit 4.22
Selenium HtmlUnit已更新到4.22。随着此次升级,依赖坐标从org.seleniumhq.selenium:htmlunit-driver
更改为org.seleniumhq.selenium:htmlunit3-driver
。升级时,请相应地更新构建配置。
WebJars定位器集成
为了加快启动时间并高效解析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版本。
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>
对于Gradle:
graalvmNative {metadataRepository {version = '0.3.14'}
}
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
、gelf
或logstash
。类似地,要启用结构化控制台日志记录,请设置logging.structured.format.console
。
要了解有关Spring Boot对结构化日志记录的支持,包括如何定义自定义格式,请参阅参考文档。
@Fallback
Beans
@ConditionalOnSingleCandidate
现在支持@Fallback
beans。如果有单个主bean,或者如果没有主bean但有单个非回退bean,则条件将匹配。
定义其他Beans
在类型匹配时,基于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跨度。为此,请将新的配置属性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对MockMvc的支持
当AssertJ在类路径上时,提供对MockMvcTester
的自动配置。MockMvcTester
允许您使用流畅的API定义请求和断言。它可以注入到任何有MockMvc
的地方。
有关更多详细信息,请参阅Spring Framework参考文档的专用部分。
Spring Pulsar
现在提供了用于配置默认租户和命名空间的配置属性。当使用不完全限定的主题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的Configuration
对象使用的FreeMarker变量。为此,定义一个或多个类型为FreeMarkerVariablesCustomizer
的bean。这些bean将按照定义的顺序(如果有)被调用。
带有ActiveMQ Classic的嵌入式代理支持
由于ActiveMQ Classic现在再次支持嵌入式代理,自动配置已更新以支持它。
请注意,与Spring Boot 2.7.x相反,ActiveMQ启动器仅为客户端。要使用嵌入式代理,应将org.apache.activemq:activemq-broker
添加到您的应用程序中。
配置元数据
注释处理器现在可以检测Enum
的默认值。如果您添加了手动元数据来提供自定义属性的值,请确保将其删除。
弃用和替换自动配置类
为了更轻松地演进自动配置,引入了对弃用和替换自动配置类的支持。可以在新的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.replacements
文件中声明替换。要了解更多信息,请参阅参考文档。
虚拟线程
如果启用了虚拟线程,以下组件现在将使用它们:
OtlpMeterRegistry
- Undertow Web服务器
镜像构建改进
Spring Boot现在默认使用paketobuildpacks/builder-jammy-java-tiny
。此构建器开箱即支持ARM和x64平台。
在用于构建OCI镜像的Maven和Gradle插件中添加了一个trustBuilder
选项。此选项控制如何调用CNB生命周期,在使用来自不可信源的构建器时提供更高的安全性。默认情况下,来自Paketo项目、Heroku和Google的构建器是受信任的。有关信息,请参阅Maven或Gradle文档。
在用于构建OCI镜像的Maven和Gradle插件中添加了一个imagePlatform
选项。此选项可用于指定为运行CNB构建包而拉取的任何CNB构建器、运行时和构建包镜像的操作系统和架构。当主机平台支持模拟其他操作系统/架构时(例如,在使用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的
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日志记录。
测试容器改进
- 支持
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捆绑包,现在在/actuator/info
下有一个新的端点显示SSL信息(有效期、颁发者、主题等)。此端点还会显示即将过期的证书,以提醒您需要尽快轮换它们。有一个新的配置属性management.health.ssl.certificate-validity-warning-threshold
可用于配置阈值。还添加了一个新的健康检查来监控SSL证书。如果证书无效,它将状态设置为OUT_OF_SERVICE
。
/actuator/scheduledtasks
端点的额外信息
/scheduledtasks
Actuator端点现在公开有关计划任务的额外元数据,例如“下一次计划执行时间”和“上次执行时间、状态和异常”。
依赖升级
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使用之前对其进行自定义。 - 用于创建JCache
CacheManager
的属性现在可以通过定义JCachePropertiesCustomizer
bean进行自定义。 - Spring MVC使用的
RequestToViewNameTranslator
现在可以通过定义名为viewNameTranslator
的bean进行自定义。 - Lettuce的
ClientOptions
现在可以使用LettuceClientOptionsBuilderCustomizer
bean进行自定义。要对整个LettuceClientConfiguration
进行更广泛的配置,请继续使用LettuceClientConfigurationBuilderCustomizer
。 - 新的自定义器
ProxyConnectionFactoryCustomizer
可用于自定义R2DBCProxyConnectionFactory
。 - 如果发生Spring Security注销,现在会发布一个审计事件。
JavaMailSender
上的TLS现在可以使用新的属性spring.mail.ssl.*
通过SSL捆绑包进行配置。- GSON的严格性现在可以使用新的
spring.gson.strictness
属性进行配置。 @Name
现在可以用于JavaBean风格的配置属性的字段上,以自定义其名称。- 当从另一个
DataSource
派生时,如果源DataSource
不公开驱动程序类名,DataSourceBuilder
现在可以使用源DataSource
的URL确定驱动程序类名。 - 在Cloud Foundry平台上,现在自动启用活跃度和就绪度健康探测。
- 新的属性
spring.application.version
可用于读取和设置应用程序版本。该属性的默认值取自清单的Implementation-Version
。 - 自动配置的
EntityManagerFactoryBuilder
也定义了原生(例如Hibernate)属性。 - Spring Integration的
TaskScheduler
现在即使没有使用@EnableScheduling
也能感知虚拟线程。 @ConditionalOnAvailableEndpoint
现在有一个value
别名用于endpoint
。- 添加了一个新的配置属性
spring.data.web.pageable.serialization-mode
,用于配置Spring Data Web的序列化模式。 - 当使用
SpringApplication.from(…)
语法时,现在可以指定要激活的其他配置文件。 - Spring Boot插件不再在构建包环境中设置
BP_NATIVE_IMAGE: true
。 - 注册的
@ConfigurationProperties
bean现在尊重@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
可用于禁用日志导出。 - Spring Batch使用的
TaskExecutor
现在可以通过定义一个带有@BatchTaskExectuor
注释的TaskExecutor
bean进行自定义。 - Spring Session自动配置现在在反应式Web应用程序中支持
indexed
存储库类型。 - 如果未配置池暂停且创建了检查点,
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
。
相关文章:

Spring Boot 3.4.0 发行:革新与突破的里程碑
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
【网络安全】
黑客入侵 什么是黑客入侵? “黑客”是一个外来词,是英语单词hacker的中文音译。最初,“黑客”只是一个褒义词,指的是那些尽力挖掘计算机程序最大潜力的点脑精英,他们讨论软件黑客的技巧和态度,以及共享文化…...

在SQLyog中导入和导出数据库
导入 假如我要导入一个xxx.sql,我就先创建一个叫做xxx的数据库。 然后右键点击导入、执行SQL脚本 选择要导入的数据库文件的位置,点击执行即可 注意: 导入之后记得刷新一下导出 选择你要导出的数据库 右键选择:备份/导出、…...

RabbitMQ简单应用
概念 RabbitMQ 是一种流行的开源消息代理(Message Broker)软件,它实现了高级消息队列协议(AMQP - Advanced Message Queuing Protocol)。RabbitMQ 通过高效的消息传递机制,主要应用于分布式系统中解耦应用…...

使用LUKS对Linux磁盘进行加密
前言 本实验用于日常学习用,如需对存有重要数据的磁盘进行操作,请做好数据备份工作。 此实验只是使用LUKS工具的冰山一角,后续还会有更多功能等待探索。 LUKS(Linux Unified Key Setup)是Linux系统中用于磁盘加密的一…...

戴尔电脑安装centos7系统遇到的问题
1,找不到启动盘(Operation System Loader signature found in SecureBoot exclusion database(‘dbx’).All bootable devices failed secure Boot Verification) 关闭 Secure Boot(推荐): 进入 BIOS/UEFI…...

3.4.SynchronousMethodHandler组件之ResponseHandler
前言 feign发送完请求后, 拿到返回结果, 那么这个返回结果肯定是需要经过框架进一步处理然后再返回到调用者的, 其中ResponseHandler就是用来处理这个返回结果的, 这也是符合正常思维的处理方式, 例如springmvc部分在调用在controller端点前后都会增加扩展点。 从图中可以看得…...

Linux 下进程的状态
操作系统中常见进程状态 在操作系统中有六种常见进程状态: 新建状态: 进程正在被创建. 此时操作系统会为进程分配资源, 如: 内存空间等, 进行初始化就绪状态: 进程已经准备好运行了, 只需要等待被调度, 获取 CPU 资源就可以执行了, 操作系统中可能同时存在多个进程处于就绪状…...

【计算机网络】核心部分复习
目录 交换机 v.s. 路由器OSI七层更实用的TCP/IP四层TCPUDP 交换机 v.s. 路由器 交换机-MAC地址 链接设备和设备 路由器- IP地址 链接局域网和局域网 OSI七层 物理层:传输设备。原始电信号比特流。数据链路层:代表是交换机。物理地址寻址,交…...
Spring Boot开发实战:从入门到构建高效应用
Spring Boot 是 Java 开发者构建微服务、Web 应用和后端服务的首选框架之一。其凭借开箱即用的特性、大量的自动化配置和灵活的扩展性,极大简化了开发流程。本文将以实战为核心,从基础到高级,全面探讨 Spring Boot 的应用开发。 一、Spring B…...

pyshark安装使用,ubuntu:20.04
1.容器创建 命令 docker run -d --name pyshark -v D:\src:/root/share ubuntu:2004 /bin/bash -c "while true;do sleep 1000;done" 用于创建并启动一个新的 Docker 容器。 docker run -d --name pyshark -v D:\src:/root/share ubuntu:2004 /bin/bash -c "w…...

基本功能实现
目录 1、环境搭建 2、按键控制灯&电机 LED 电机 垂直按键(机械按键) 3、串口调试功能 4、定时器延时和定时器中断 5、振动强弱调节 6、万年历 7、五方向按键 1、原理及分析 2、程序设计 1、环境搭建 需求: 搭建一个STM32F411CEU6工程 分析: C / C 宏定义栏…...
《那个让服务器“跳舞”的bug》
在程序的世界里,bug 就像隐藏在暗处的小怪兽,时不时跳出来捣乱。而在我的职业生涯中,有一个bug让我至今难忘,它不仅让项目差点夭折,还让我熬了无数个通宵。这个故事发生在一个风和日丽的下午,我们正在开发一…...
Python 网络爬虫进阶:动态网页爬取与反爬机制应对
在上一篇文章中,我们学习了如何使用 Python 构建一个基本的网络爬虫。然而,在实际应用中,许多网站使用动态内容加载或实现反爬机制来阻止未经授权的抓取。因此,本篇文章将深入探讨以下进阶主题: 如何处理动态加载的网…...
创建可直接用 root 用户 ssh 登陆的 Docker 镜像
有时候我们在 Mac OS X 或 Windows 平台下需要开发以 Linux 为运行时的应用,IDE 或可直接使用 Docker 容器,或 SSH 远程连接。本地命令行下操作虽然可以用 docker exec 连接正在运行的容器,但 IDE 远程连接的话 SSH 总是一种较为通用的连接方…...
wordpress 中添加图片放大功能
功能描述 使用 Fancybox 实现图片放大和灯箱效果。自动为文章内容中的图片添加链接,使其支持 Fancybox。修改了 header.php 和 footer.php 以引入必要的 CSS 和 JS 文件。在 functions.php 中通过过滤器自动为图片添加 data-fancybox 属性。 最终代码 1. 修改 hea…...

数据结构 (7)线性表的链式存储
前言 线性表是一种基本的数据结构,用于存储线性序列的元素。线性表的存储方式主要有两种:顺序存储和链式存储。链式存储,即链表,是一种非常灵活和高效的存储方式,特别适用于需要频繁插入和删除操作的场景。 链表的基本…...

库的操作.
创建、删除数据库 创建语法: CREATE DATABASE [IF NOT EXISTS] db_name[ ]是可选项,IF NOT EXISTS 是表明如果不存在才能创建数据库 //查看数据库,假设7行 show databases; //创建数据库 --- 本质在Linux创建一个目录 create database databa…...

Vue进阶之Vue CLI服务—@vue/cli-service Vuex
Vue CLI服务—vue/cli-service & Vuex vue/cli-service初识bin/vue-cli-service.js代码执行解读 Vuexgenerator/index.jsstore/index.js插件化的能力怎么引入呢? vue/cli-service 初识 第一块是上一个讲述的cli是把我们代码的配置项,各种各样的插件…...

导入100道注会cpa题的方法,导入试题,自己刷题
一、问题描述 复习备考的小伙伴们,往往希望能够利用零碎的时间和手上的试题,来复习和备考 用一个能够导入自己试题的刷题工具,既能加强练习又能利用好零碎时间,是一个不错的解决方案 目前市面上刷题工具存下这些问题 1、要收费…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...