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、要收费…...
数据库操作、锁特性
1. DML、DDL和DQL是数据库操作语言的三种主要类型 1.1 DML(Data Manipulation Language)数据操纵语言 DML是用于检索、插入、更新和删除数据库中数据的SQL语句。 主要的DML语句包括: SELECT:用于查询数据库中的数据。 INSERT&a…...
学习笔记039——SpringBoot整合Redis
文章目录 1、Redis 基本操作Redis 默认有 16 个数据库,使用的是第 0 个,切换数据库添加数据/修改数据查询数据批量添加批量查询删除数据查询所有的 key清除当前数据库清除所有数据库查看 key 是否存在设置有效期查看有效期 2、Redis 数据类型String追加字…...
(笔记)简单了解ZYNQ
1、zynq首先是一个片上操作系统(Soc),结合了arm(PS)和fpga(PL)两部分组成 Zynq系统主要由两部分组成:PS(Processing System)和PL(Programmable L…...
大众点评小程序mtgsig1.2算法
测试效果: var e function _typeof(o) {return "function" typeof Symbol && "symbol" typeof Symbol.iterator? function (o) {return typeof o;}: function (o) {return o && "function" typeof Symbol &…...
七牛云AIGC内容安全方案助力企业合规创新
随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…...
.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角
窗体透明, 将Form的属性Opacity,由默认的100% 调整到 80%,这个数字越小越透明(尽量别低于50%,不信你试试看)! 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&…...
基于YOLOv8深度学习的智慧课堂教师上课行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
随着人工智能技术的迅猛发展,智能课堂行为分析逐渐成为提高教学质量和提升教学效率的关键工具之一。在现代教学环境中,能够实时了解教师的课堂表现和行为,对于促进互动式教学和个性化辅导具有重要意义。传统的课堂行为分析依赖于人工观测&…...
使用 Tkinter 创建一个简单的 GUI 应用程序来合并视频和音频文件
使用 Tkinter 创建一个简单的 GUI 应用程序来合并视频和音频文件 Python 是一门强大的编程语言,它不仅可以用于数据处理、自动化脚本,还可以用于创建图形用户界面 (GUI) 应用程序。在本教程中,我们将使用 Python 的标准库模块 tkinter 创建一…...
【C++笔记】模板进阶
前言 各位读者朋友们大家好!上一期我们讲了stack、queue以及仿函数。先前我们讲过模板的初阶内容,这一期我们来更深入的学习一下模板。 一. 非类型模板参数 1.1 非类型模板参数 模板参数分为类型形参和类类型形参: 类型形参:…...
Soul App创始人张璐团队亮相GITEX GLOBAL 2024,展示多模态AI的交互创新
随着全球AI领域的竞争加剧,越来越多的科技巨头和创新企业纷纷致力于多模态AI的开发。2024年10月14日至18日,GITEX GLOBAL海湾信息技术博览会在迪拜举行,吸引了超过6700家全球科技巨头和创新公司参与,展示了智能互联、人工智能等领域的新成果。 此次展会中,Soul App创始人张璐团…...
wordpress高阶教程/怎么让某个关键词排名上去
目录 Bash 的变量和运算符 什么是变量 变量的分类 用户自定义变量 变量定义 变量调用 变量查看 变量删除 Bash 的变量和运算符 什么是变量 在定义变量时,有一些规则需要遵守:变量名称可以由字母、数字和下划线组成,但是不能以数字…...
wordpress加特效/网站seo分析常用的工具是
请点击查看我的有道云笔记 http://note.youdao.com/noteshare?id50ba601bc935913962c6f025aec59cf2&sub0F4F897E6B2B48BD9535A34807C0F17F...
新版新白娘子传奇小青最后和谁在一起了/长沙优化排名
http://www.sdpc.gov.cn/zcfb/zcfbl/201503/t20150313_667332.html 《外商投资产业指导目录(2015年修订)》已经国务院批准,现予以发布,自2015年4月10日起施行。2011年12月24日国家发展和改革委员会、商务部发布的《外商投资产业指…...
如何设置网站关键词/自媒体135网站
更正:我使用这种方式制作了完整安装包9.4.3,9.4.3安装好以后更新到9.4.4没有问题,然后从9.4.4更新到这个月的9.4.5时需要安装包中的.msi文件。这可能会给IT管理员带来不便,出现此问题时需要把Adobe Reader卸载,再重新安…...
网站备案 论坛/百度云服务器官网
root-tools 项目地址:root-toolsRootToolsNeo 正式发布啦~ RootTools 是一款专注于给 root 后的用户提供方便的软件。主要提供: 应用冻结 不删除系统内的应用,而是将其冻结,在需要时可以解冻,但是别乱来哦,…...
百度建设网站的目的/网络营销教案ppt
rvm 全称Ruby Version Manager, 确实是一个非常好用的ruby版本管理以及安装工具.下面介绍一下rvm的安装, 使用rvm, 安装ruby, 以及gem的使用.一、安装rvm官方网站上介绍得很简单, 但是使用官方网站安装会出现问题, SSL的问题. 所以我分两步进行, 第一步下载安装脚本. 第二步修…...