当前位置: 首页 > ds >正文

SpringBoot4发布!新特性解析

不知道大家最近没有发现?在我们新创建 Spring Boot 项目的时候,已经有了 Spring Boot 4.0.0 预览版这个选项了,如下图所示:

并且 Spring Boot 4 底层是基于全新的 Spring Framework 7.0.0 实现的,如下图所示:

那么问题来了,新版本都有哪些重要的变更呢?接下来由磊哥带着大家抢先来看。

1.优雅版本控制

新版本引入了优雅的 API 版本控制支持,允许开发者通过 @RequestMapping 注解中的 version 参数来实现版本控制,如下代码所示:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
publicclass VersionedController {@RequestMapping(value = "/user", version = "1")public String getUserV1() {// 版本1实现System.out.println("Version 1");return"Version 1";}@RequestMapping(value = "/user", version = "2")public String getUserV2() {// 版本2实现System.out.println("Version 2");return"Version 2";}
}

程序执行效果:

2.方便的Bean注入

新版本引入了新的 BeanRegistrar 合约,允许更灵活地注册 Bean(一次性注入多个 Bean),示例代码如下:

import org.springframework.beans.factory.BeanRegistrar;
import org.springframework.beans.factory.BeanRegistry;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.Environment;@Configuration
@Import(MyBeansRegistrar.class)
public class MyConfiguration {
}class MyBeansRegistrar implements BeanRegistrar {@Overridepublic void register(BeanRegistry registry,Environment env) {registry.registerBean("user", User.class);if (env.matchesProfiles("dev")) {registry.registerBean(Order.classspec -> spec.supplier(context -> new Order("order_001")));}}
}class User {private String name;
}class Order {public Order(String name) {this.name = name;}private String name;
}

写一个单元测试证明注册的 Bean 是可以正常使用的:

3.Null安全改进

新版本采用 JSpecify 注解来声明 API 的空值安全性,使用 @Nullable 表示可为 Null,使用 @NonNull 表示不能为空,并且会通过 Idea 配合提示警告或错误信息,例如以下代码:

import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;publicclass Person {private String name;public void setName(@NonNull String name) {this.name = name;}@Nullablepublic String getName() {returnthis.name;}
}

在 Idea 中也能看到警告信息:

不同 Idea 版本展现形式不一样,博主使用的是 Idea 2024,新版本应该才会支持新特性。

4.HTTP代理轻松创建

新版本提供了 @ImportHttpServices 注解,让你为 HTTP 接口创建代理更加容易,示例代码如下(它允许您轻松声明、检测和配置整个 HTTP 服务组):

@Configuration(proxyBeanMethods = false)
@ImportHttpServices(group = "weather", types = {FreeWeather.classCommercialWeather.class})
@ImportHttpServices(group = "user", types = {UserServiceInternal.classUserServiceOfficial.class})
static class HttpServicesConfiguration extends AbstractHttpServiceRegistrar {@Beanpublic RestClientHttpServiceGroupConfigurer groupConfigurer() {return groups -> groups.filterByName("weather""user").configureClient((group, builder) -> builder.defaultHeader("User-Agent""My-Application"));}
}

5.其他七个变更

其他升级的特性还包括:

  1. SPEL 表达式升级:SPEL 表达式中支持空安全和 Elvis 运算符,例如以下代码:

    @Value("#{systemProperties['pop3.port'] ?: 25}")
    

    它表示,将注入系统属性 pop3.port 的值,如果未定义该属性值,注入 25 这个值。

  2. GraalVM 原生应用支持:借助 Spring AOT 技术,将应用编译成原生镜像,极大地缩短了启动时间。

  3. 支持 Jackson 3.x:放弃对 Jackson 2.x 的支持,升级为 Jackson 3.x。

  4. Servlet 和 WebSocket 版本升级:使用 Servlet 6.1 和 WebSocket 2.2 作为 Web 应用程序的底层实现,这意味着应用程序应该部署在最新的 Servlet 容器上,比如 Tomcat 11+ 和 Jetty 12.1+。

  5. HttpHeaders 优化:HttpHeaders 操作如下:

    @RestController
    publicclass MyController {@GetMapping("/headers")public ResponseEntity<String> handleRequest(HttpHeaders headers) {// 旧方式(已废弃)// headers.getFirst("X-Custom-Header");// 新方式String value = headers.firstValue("X-Custom-Header").orElse(null);// 遍历所有头部headers.forEach((name, values) -> {System.out.println(name + ": " + values);});return ResponseEntity.ok("Processed");}
    }
    
  6. 功能删除:新版本中的删除的内容如下:

    • Spring MVC 的 XML 配置名称空间现在被弃用,取而代之的是 Java 配置体。

    • Spring TestContext 框架中的 JUnit 4 支持现在已经被弃用。

    • Jackson 2.x 支持已被弃用,取而代之的是 Jackson 3.x。

    • Spring JCL 停用。

  7. 最低环境要求提高

    • Jakarta EE 11 (Tomcat 11+)

    • Kotlin 2.x

    • JSONassert 2.0

    • GraalVM 23

更多升级信息参考官网:https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-7.0-Release-Notes

小结

程序员是干到老学到老的行业,框架和工具的变更意味着我们会有更便利、更友好的调用方式,所以对于程序员是利好的,因此一起学起来、用起来、折腾起来吧。

http://www.xdnf.cn/news/18528.html

相关文章:

  • 2025.8.21总结
  • 【Bug】CentOS 7 使用vim命令报错vim: command not found
  • 37、需求预测与库存优化 (快消品) - /供应链管理组件/fmcg-inventory-optimization
  • AP状态管理中提到的两种“业务逻辑”
  • Java实现一个简单的LRU缓存对象
  • 50 C++ STL模板库-算法库 algorithm
  • python的校园研招网系统
  • RHCA10NUMA
  • Pytorch框架学习
  • Git 新手完全指南(一):从零开始掌握版本控制
  • 59. 螺旋矩阵 II|从“左闭右开”的圈层模拟入手(附图解与 C++ 实现)
  • 在 Linux 和 Docker 中部署 MinIO 对象存储
  • 使用Spring Retry组件优雅地实现重试
  • 【Python】利用heapq 模块实现一个按优先级排序的队列
  • 数字化图书管理系统设计实践(java)
  • CorrectNav——基于VLM构建带“自我纠正飞轮”的VLN:通过「视觉输入和语言指令」预测导航动作,且从动作和感知层面生成自我修正数据
  • 学习嵌入式的第二十二天——数据结构——双向链表
  • 永磁同步电机谐波抑制算法(13)——传统预测控制与传统谐波抑制的碰撞
  • week2-[二维数组]排队
  • MySQL 50 道经典练习题及答案
  • Java毕业设计选题推荐 |基于SpringBoot+Vue的知识产权管理系统设计与实现
  • Effective C++ 条款52:写了placement new也要写placement delete
  • ES常用查询命令
  • SQL详细语法教程(七)核心优化
  • ubuntu系统上的conda虚拟环境导出方便下次安装
  • PiscCode使用MediaPipe Face Landmarker实现实时人脸特征点检测
  • YOLO11 到 C++ 落地全流程:ONNX 导出、NMS 判别与推理实战
  • Java 通过 m3u8 链接下载所有 ts 视频切片并合并转换为 mp4 格式
  • 《GPT-OSS 模型全解析:OpenAI 回归开源的 Mixture-of-Experts 之路》
  • 深入理解MySQL Ⅳ -- SQL性能分析工具