王炸级更新!Spring Boot 3.4 正式发布,新特性真香!

一、引言

Spring Boot 3.4 带来了显著的性能提升、可观察性增强和开发体验改进。但在升级过程中,某些变更需要特别注意,以确保应用程序继续正常运行。本指南将深入介绍最重要的变更,并提供代码示例以帮助您顺利完成过渡。

二、主要变更和增强功能

2.1 RestClient 和 RestTemplate

2.1.1 新特性

自动配置支持:RestClient 和 RestTemplate 现在支持多种 HTTP 客户端的自动配置,不再需要手动配置 RestClient.builder() 包括:

Apache HTTP Components

Jetty Client

Reactor Netty 的 HttpClient

JDK 的 HttpClient

2.1.2 客户端优先级顺序

Apache HTTP Components (HttpComponentsClientHttpRequestFactory)

Jetty Client (JettyClientHttpRequestFactory)

Reactor Netty HttpClient (ReactorClientHttpRequestFactory)

JDK HttpClient (JdkClientHttpRequestFactory)

简单的 JDK HttpURLConnection (SimpleClientHttpRequestFactory)

2.1.3 配置示例

复制代码
# 1. 使用 http-components
spring.http.client.factory=http-components

# 2. 使用 jetty
spring.http.client.factory=jetty

# 3. 禁用重定向
spring.http.client.redirects=dont-follow

2.1.4 自定义客户端示例

复制代码
@Bean
public HttpComponentsClientHttpRequestFactorvBuilder httoComponentsClientHttpRequestFactoryBuilder() {
	return ClientHttpRequestFactoryBuilder.httpComponents()
		.withDefaultRequestConfigCustomizer(bilder -> builder,setProtocolUpgradeEnabled(false));
}

这或许是一个对你有用的开源项目,mall项目是一套基于 SpringBoot3 + Vue 的电商系统(Github标星60K),后端支持多模块和 2024最新微服务架构 ,采用Docker和K8S部署。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!

Boot项目:https://github.com/macrozheng/mall

Cloud项目:https://github.com/macrozheng/mall-swarm

视频教程:https://www.macrozheng.com/video/

项目演示:

2.2 配置属性的 Bean 验证

2.2.1 主要变更

验证现在严格遵循 Bean Validation 规范

只有在字段上标注了 @Valid 注解时才会对嵌套属性进行验证

2.2.2 改造示例

修改前:

复制代码
@ConfigurationProperties(prefix = "pig")
@Validated
public class GatewayConfigProperties {
    private SwaggerProperties swagger;
}

修改后:

复制代码
@ConfigurationProperties(prefix = "pig")
@Validated
public class GatewayConfigProperties {
    @Valid  // 添加此注解
    private SwaggerProperties swagger;
}

2.3 优雅关闭功能

2.3.1 默认特性

所有嵌入式 Web 服务器现在默认启用优雅关闭

包括:Jetty、Reactor Netty、Tomcat、Undertow

2.3.2 配置方法

禁用优雅关闭:

复制代码
server.shutdown=immediate

2.4 结构化日志记录

2.4.1 支持的格式

Elastic Common Schema (ECS)

复制代码
{"@timestamp":"2024-01-01T10:15:00.067462556Z","log.level":"INFO","process.pid":39599,"process.thread.name":"main","service.name":"simple","log.logger":"org.example.Application","message":"No active profile set, falling back to 1 default profile: "default"","ecs.version":"8.11"}

Graylog Extended Log Format (GELF)

复制代码
{"version":"1.1","short_message":"No active profile set, falling back to 1 default profile: "default"","timestamp":1725958035.857,"level":6,"_level_name":"INFO","_process_pid":47649,"_process_thread_name":"main","_log_logger":"org.example.Application"}

Logstash

复制代码
{"@timestamp":"2024-01-01T10:15:00.111037681+02:00","@version":"1","message":"No active profile set, falling back to 1 default profile: "default"","logger_name":"org.example.Application","thread_name":"main","level":"INFO","level_value":20000}

2.4.2 配置方法

启用 ECS 格式:

复制代码
# 文件输出使用 ECS 格式
logging.structured.format.file=ecs

# 控制台输出使用 ECS 格式
logging.structured.format.console=ecs

2.5 可观察性改进

2.5.1 应用程序分组

复制代码
# 设置应用程序组
spring.application.group=order-processing

# 在日志中包含组信息
logging.include-application.group=true

2.5.2 OTLP 跟踪增强

复制代码
# 启用 gRPC 传输
management.otlp.tracing.transport=grpc

# 设置端点
management.otlp.tracing.endpoint=grpc://otel-collector:4317

三、依赖版本升级

3.1 Spring 核心框架

Spring Framework -> 6.2

Spring Data -> 2024.1

Spring Security -> 6.4

Spring Batch -> 5.2

3.2 第三方库

Hibernate -> 6.6

Jackson -> 2.18.0

Micrometer -> 1.14

Reactor -> 2024.0

Testcontainers -> 1.20.3

3.3 Maven 配置示例

复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.4.0</version>
    <relativePath/>
</parent>

四、测试功能增强

4.1 MockMvc 的 AssertJ 支持

复制代码
@Autowired
private MockMvcTester mockMvcTester;

@Test
void testEndpoint() throws Exception {
    mockMvcTester.get("/api/data")
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.name").value("Sample Data"));
}

五、废弃特性处理

5.1 已废弃的配置

修改前:

management.endpoints.enabled-by-default=false

management.endpoint.health.enabled=true

修改后:

management.endpoints.access.default=none

management.endpoint.health.access=read-only

相关推荐
触底反弹10 小时前
🚀 Node.js path 和 fs 模块,从回调地狱到 async/await 的进化之路!
javascript·后端·node.js
极光代码工作室10 小时前
基于SpringBoot的订单管理系统
java·springboot·web开发·后端开发
xiaoduzi199110 小时前
ConcurrentHashMap学习
java·学习
折哥的程序人生 · 物流技术专研11 小时前
《Java 100 天进阶之路》第53篇:volatile与JMM(2026版)
java·volatile·内存屏障·可见性·java内存模型·jmm·java100天进阶
米饭不加菜11 小时前
使用万用表判断三极管(BJT)好坏
java·开发语言
Csvn11 小时前
Python 开发技巧 · 生成器(Generator)进阶 —— 从 yield 到 yield from,写出省内存的生产者-消费者模式
后端·python
geovindu11 小时前
CSharp: Dijkstra Algorithms
开发语言·后端·算法·c#
Maynor99611 小时前
AI Coding 零基础实战教程|第五部分:完整项目案例实操
java·前端·人工智能·claude code·ai coding
生戎马11 小时前
Tomcat Container容器之Engine:StandardEngine _
java·tomcat
zhangjw3412 小时前
第29篇:Java伪共享与对象分配:并发性能优化的关键
java·开发语言·性能优化