最新 Spring Boot 3.4 发布!新功能速览,这些功能非常实用

文摘   2024-11-25 08:00   新疆  

最新实战案例锦集:《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:      base-path: /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 时,该条件将匹配。如下示例:

@Configurationpublic class FallbackConfig {    @Bean  DAO a() {    return new A() ;  }  @Bean  @Fallback  DAO b() {    return new B() ;  }    @Bean  @ConditionalOnSingleCandidate(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      connect-timeout: 10000      read-timeout: 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:  include-application-name: true  include-application-group: 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 Boot全新模块化管理方式

推荐学习!拆解Spring Cloud 4大核心组件,彻底搞懂工作原理(负载均衡)

性能提升!Spring Boot使用Guava中3大神技

推荐学习!玩转Spring Boot配置文件加载,完全自定义底层实现

自定义注解+SpEL实现强大的权限管理

在SpringBoot项目中使用CompletableFuture优化并发REST调用的正确姿势

强大!基于Spring Boot HTTP请求响应日志记录组件,值得一用

别不信@PathVariable你真不会用

当心!SpringBoot在以下几种情况将导致代理失效

RabbitMQ非常实用技巧,动态调整消息并发处理能力

强大!SpringBoot结合STOMP简化数据实时通信

优雅!SpringBoot统一返回结果就该这样处理

SpringBoot自带Controller接口监控,赶紧用起来

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章