找回密码
 立即注册
首页 业界区 业界 重磅!SpringBoot4发布,11项重大变更全解析! ...

重磅!SpringBoot4发布,11项重大变更全解析!

宛蛲 2025-6-3 00:37:08
不知道大家最近没有发现?在我们新创建 Spring Boot 项目的时候,已经有了 Spring Boot 4.0.0 预览版这个选项了,如下图所示:
1.png

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

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

新版本引入了优雅的 API 版本控制支持,允许开发者通过 @RequestMapping 注解中的 version 参数来实现版本控制,如下代码所示:
  1. import org.springframework.web.bind.annotation.RequestMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. @RestController
  4. @RequestMapping("/api")
  5. public class VersionedController {
  6.     @RequestMapping(value = "/user", version = "1")
  7.     public String getUserV1() {
  8.         // 版本1实现
  9.         System.out.println("Version 1");
  10.         return "Version 1";
  11.     }
  12.     @RequestMapping(value = "/user", version = "2")
  13.     public String getUserV2() {
  14.         // 版本2实现
  15.         System.out.println("Version 2");
  16.         return "Version 2";
  17.     }
  18. }
复制代码
程序执行效果:
3.png

2.方便的Bean注入

新版本引入了新的 BeanRegistrar 合约,允许更灵活地注册 Bean(一次性注入多个 Bean),示例代码如下:
  1. import org.springframework.beans.factory.BeanRegistrar;
  2. import org.springframework.beans.factory.BeanRegistry;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.context.annotation.Import;
  5. import org.springframework.core.env.Environment;
  6. @Configuration
  7. @Import(MyBeansRegistrar.class)
  8. public class MyConfiguration {
  9. }
  10. class MyBeansRegistrar implements BeanRegistrar {
  11.     @Override
  12.     public void register(BeanRegistry registry,
  13.                          Environment env) {
  14.         registry.registerBean("user", User.class);
  15.         if (env.matchesProfiles("dev")) {
  16.             registry.registerBean(Order.class, spec -> spec
  17.                     .supplier(context -> new Order("order_001")));
  18.         }
  19.     }
  20. }
  21. class User {
  22.     private String name;
  23. }
  24. class Order {
  25.     public Order(String name) {
  26.         this.name = name;
  27.     }
  28.     private String name;
  29. }
复制代码
写一个单元测试证明注册的 Bean 是可以正常使用的:
4.png

3.Null安全改进

新版本采用 JSpecify 注解来声明 API 的空值安全性,使用 @Nullable 表示可为 Null,使用 @NonNull 表示不能为空,并且会通过 Idea 配合提示警告或错误信息,例如以下代码:
  1. import org.jspecify.annotations.NonNull;
  2. import org.jspecify.annotations.Nullable;
  3. public class Person {
  4.     private String name;
  5.     public void setName(@NonNull String name) {
  6.         this.name = name;
  7.     }
  8.     @Nullable
  9.     public String getName() {
  10.         return this.name;
  11.     }
  12. }
复制代码
在 Idea 中也能看到警告信息:
5.png

不同 Idea 版本展现形式不一样,博主使用的是 Idea 2024,新版本应该才会支持新特性。
4.HTTP代理轻松创建

新版本提供了 @ImportHttpServices 注解,让你为 HTTP 接口创建代理更加容易,示例代码如下(它允许您轻松声明、检测和配置整个 HTTP 服务组):
  1. @Configuration(proxyBeanMethods = false)
  2. @ImportHttpServices(group = "weather", types = {FreeWeather.class, CommercialWeather.class})
  3. @ImportHttpServices(group = "user", types = {UserServiceInternal.class, UserServiceOfficial.class})
  4. static class HttpServicesConfiguration extends AbstractHttpServiceRegistrar {
  5.     @Bean
  6.     public RestClientHttpServiceGroupConfigurer groupConfigurer() {
  7.         return groups -> groups.filterByName("weather", "user")
  8.                 .configureClient((group, builder) -> builder.defaultHeader("User-Agent", "My-Application"));
  9.     }
  10. }
复制代码
5.其他七个变更

其他升级的特性还包括:

  • SPEL 表达式升级:SPEL 表达式中支持空安全和 Elvis 运算符,例如以下代码:
    1. @Value("#{systemProperties['pop3.port'] ?: 25}")
    复制代码
    它表示,将注入系统属性 pop3.port 的值,如果未定义该属性值,注入 25 这个值。
  • GraalVM 原生应用支持:借助 Spring AOT 技术,将应用编译成原生镜像,极大地缩短了启动时间。
  • 支持 Jackson 3.x:放弃对 Jackson 2.x 的支持,升级为 Jackson 3.x。
  • Servlet 和 WebSocket 版本升级:使用 Servlet 6.1 和 WebSocket 2.2 作为 Web 应用程序的底层实现,这意味着应用程序应该部署在最新的 Servlet 容器上,比如 Tomcat 11+ 和 Jetty 12.1+。
  • HttpHeaders 优化:HttpHeaders 操作如下:
    1. @RestController
    2. public class MyController {
    3.     @GetMapping("/headers")
    4.     public ResponseEntity<String> handleRequest(HttpHeaders headers) {
    5.         // 旧方式(已废弃)
    6.         // headers.getFirst("X-Custom-Header");
    7.         // 新方式
    8.         String value = headers.firstValue("X-Custom-Header").orElse(null);
    9.         // 遍历所有头部
    10.         headers.forEach((name, values) -> {
    11.             System.out.println(name + ": " + values);
    12.         });
    13.         return ResponseEntity.ok("Processed");
    14.     }
    15. }
    复制代码
  • 功能删除:新版本中的删除的内容如下:

    • Spring MVC 的 XML 配置名称空间现在被弃用,取而代之的是 Java 配置体。
    • Spring TestContext 框架中的 JUnit 4 支持现在已经被弃用。
    • Jackson 2.x 支持已被弃用,取而代之的是 Jackson 3.x。
    • Spring JCL 停用。

  • 最低环境要求提高

    • 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
小结

程序员是干到老学到老的行业,框架和工具的变更意味着我们会有更便利、更友好的调用方式,所以对于程序员是利好的,因此一起学起来、用起来、折腾起来吧。
本文已收录到我的技术小站 www.javacn.site,其中包含的内容有:Spring Boot、Spring Cloud、Spring AI、LangChain4j、Dify、AI Agent、MCP、Function Call、RAG、向量数据库、Prompt、多模态、向量数据库、嵌入模型等内容。
   

关注公众号(加好友):

            
作者:        王磊的博客        
出处:        http://vipstone.cnblogs.com/        
   

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册