最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)以及 合集全部源码
环境:SpringBoot3.4.0
1. RestClient and RestTemplate
新增了自动配置 RestClient 和 RestTemplate 以使用 Reactor Netty 的 HttpClient 或 JDK 的 HttpClient 的支持。按优先级排序,现在支持的客户端是:
Apache HTTP Components (
HttpComponentsClientHttpRequestFactory
)Jetty Client (JettyClientHttpRequestFactory)
Reactor Netty HttpClient (ReactorClientHttpRequestFactory)
JDK HttpClient (JdkClientHttpRequestFactory)
Simple JDK HttpURLConnection (SimpleClientHttpRequestFactory)
注意:如果类路径上没有 HTTP 客户端库,就可能会使用 JdkClientHttpRequestFactory,而之前使用的是 SimpleClientHttpRequestFactory。可以通过设置 spring.http.client.factory 来选择特定的客户端。支持的值包括 http-components、jetty、reactor、jdk 和 simple。
2. 配置属性的Bean验证
以前,当使用 Bean Validation 实现(如 Hibernate Validator)对带有 @Validated 注解的 @ConfigurationProperties 类进行验证时,无论是否使用了 @Valid 注解,嵌套属性的验证都会在其绑定时执行。而在 Spring Boot 3.4 中,验证行为现在遵循 Bean Validation 规范。验证将从 @ConfigurationProperties 注解的类开始,并且仅当对应的字段被 @Valid 注解时,才会向下级联到嵌套属性。
在升级过程中,请检查带有 Bean Validation 约束的 @ConfigurationProperties 类。根据需要,在希望验证级联到嵌套属性的地方添加 @Valid 注解。
3. 优雅停机
现在,默认启用了嵌入式Web服务器(Jetty、Rector Netty、Tomcat 或 Undertow)的优雅关闭功能。如果你需要恢复先前的行为,可以将 server.shutdown 设置为 immediate。
4. Actuator端点访问控制
启用和禁用端点的支持已经被重新设计,取代了原有的开/关支持,采用了一种更细粒度的访问模型。新的模型除了支持禁用端点(无访问权限)和完全启用端点(无限制访问权限)之外,还支持仅允许对端点操作进行只读访问。
以下属性被弃用:
management.endpoints.enabled-by-default
management.endpoint.<id>.enabled
如下取而代之:
management.endpoints.access.default
management.endpoint.<id>.access
同样,@Endpoint 上的 enableByDefault 属性已被弃用,取而代之的是一个新的 defaultAccess 属性。
引入了一个新属性,允许操作员控制允许访问执行器端点的级别:
management.endpoints.access.max-permitted
此属性会对可能已为端点配置的任何访问权限进行限制。例如,如果将 management.endpoints.access.max-permitted
设置为 read-only
,而 management.endpoint.loggers.access
被设置为 unrestricted
,那么对 loggers
端点仅允许 read-only
访问。
如下示例,将端点/loggers访问配置为read-only后,在进行修改日志级别后将收到错误信息:
management:
endpoints:
web:
/ac :
exposure:
include: '*'
endpoint:
loggers:
access: read-only
试图修改日志级别,抛出了405错误,感觉这提示的不合理吧?。
5. 结构化日志
引入对结构化日志记录的支持,并内置支持 Elastic Common Schema (ecs)、Graylog Extended Log Format (gelf) 和 Logstash (logstash)。要启用结构化的文件日志记录,可以将 logging.structured.format.file 设置为 ecs、gelf 或 logstash。同样,要启用结构化的控制台日志记录,可以设置 logging.structured.format.console。
详细查看下面这篇文章:
重磅!Spring Boot3.4 结构化日志,强大的日志记录技术
6. @Fallback Beans
@ConditionalOnSingleCandidate 现在支持 @Fallback bean。如果存在单个主(primary)bean,或者如果没有主 bean 存在,则存在单个非回退(non-fallback)bean 时,该条件将匹配。如下示例:
public class FallbackConfig {
DAO a() {
return new A() ;
}
DAO b() {
return new B() ;
}
(DAO.class)
Service servie(DAO dao) {
System.err.println(dao) ;
return new Service(dao) ;
}
}
该示例条件将匹配,同时注入的将是A实例。
7. ClientHttpRequestFactory构建器
新增了一个 ClientHttpRequestFactoryBuilder 接口,该接口允许你为特定技术构建 ClientHttpRequestFactory 实例。构建器允许对底层组件进行细粒度的自定义,以及以一致的方式应用常见的设置。
使用接口的静态工厂方法,可为特定库创建以下构建器:
Apache HTTP Components
ClientHttpRequestFactoryBuilder.httpComponents()
Jetty Client
ClientHttpRequestFactoryBuilder.jetty()
Reactor Netty
HttpClient
ClientHttpRequestFactoryBuilder.reactor()
JDK
HttpClient
ClientHttpRequestFactoryBuilder.jdk()
Simple JDK
HttpURLConnection
ClientHttpRequestFactoryBuilder.simple()
有个该类真的太方便了。我们可以通过如下属性配置工厂:
spring:
http:
client:
factory: reactor
10000 :
10000 :
redirects: follow-when-possible
Spring Boot3.4会自动根据你配置的上述信息,构建ClientHttpRequestFactoryBuilder构建器。
8. 新增日志属性
新的 spring.application.group 属性可用于将应用程序分组,例如,如果它们都属于某个业务单元或一个更大的应用程序布局。当设置此属性时,它还会被包含在日志消息中。这种行为可以通过 logging.include-application.group 属性来控制。如下示例:
spring:
application:
name: sb-3.4
group: xxxooo
---
logging:
true :
true :
日志输出如下:
包含了应用名,与分组名称。
9. 虚拟线程
如果启用了虚拟线程,以下组件将使用虚拟线程:
OtlpMeterRegistry
Undertow web server
10. 杂项
除上述更改外,还有许多细微的调整和改进,包括:
现在可以通过定义一个 Customizer<Liquibase> bean 来在使用 Liquibase 之前对其进行自定义。
用于创建 JCache CacheManager 的属性现在可以通过定义一个 JCachePropertiesCustomizer bean 来进行自定义。
Spring MVC 使用的 RequestToViewNameTranslator 现在可以通过定义一个名为 viewNameTranslator 的 bean 来进行自定义。
Lettuce 的 ClientOptions 现在可以使用 LettuceClientOptionsBuilderCustomizer bean 来进行自定义。对于整个 LettuceClientConfiguration 的更广泛配置,继续使用 LettuceClientConfigurationBuilderCustomizer。
新的自定义器 ProxyConnectionFactoryCustomizer 可用于自定义 R2DBC 的 ProxyConnectionFactory。
如果发生 Spring Security 登出,现在会发布审计事件。
JavaMailSender 上的 TLS 现在可以使用新的属性 spring.mail.ssl.* 配置 SSL 捆绑包。
GSON 的严格性现在可以使用新的 spring.gson.strictness 属性来配置。
@Name 注解现在可以用于 JavaBean 风格配置属性的字段上来自定义其名称。
当从另一个 DataSource 导出时,DataSourceBuilder 现在可以从源 DataSource 的 URL 确定驱动程序类名,如果它没有公开驱动程序类名的话。
存活性和就绪性健康探测现在在 Cloud Foundry 平台上自动启用。
新的属性 spring.application.version 可用于读取和设置应用程序版本。该属性的默认值取自清单中的 Implementation-Version。
自动配置的 EntityManagerFactoryBuilder 定义了原生属性(例如 Hibernate 属性)。
即使没有使用 @EnableScheduling,Spring Integration 的 TaskScheduler 现在也支持虚拟线程。
@ConditionalOnAvailableEndpoint 现在有一个针对端点的值别名。
一个新的配置属性 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 现在可以通过定义一个带有 @BatchTaskExecutor 注解的 TaskExecutor bean 来进行自定义。
Spring Session 自动配置现在在响应式 Web 应用中支持索引仓库类型。
如果池挂起未配置且创建了检查点,HikariCheckpointRestoreLifecycle 将记录警告。
以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏
推荐文章
新选择!基于Spring Boot监听MySQL日志Binlog实现数据实时同步
推荐学习!拆解Spring Cloud 4大核心组件,彻底搞懂工作原理(负载均衡)
推荐学习!玩转Spring Boot配置文件加载,完全自定义底层实现
在SpringBoot项目中使用CompletableFuture优化并发REST调用的正确姿势