写点什么

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

  • 2025-05-29
    福建
  • 本文字数:2579 字

    阅读完需:约 8 分钟

不知道大家最近没有发现?在我们新创建 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")public class 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 {
@Override public void register(BeanRegistry registry, Environment env) { registry.registerBean("user", User.class); if (env.matchesProfiles("dev")) { registry.registerBean(Order.class, spec -> 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;
public class Person { private String name;
public void setName(@NonNull String name) { this.name = name; }
@Nullable public String getName() { return this.name; }}
复制代码


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



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


4.HTTP 代理轻松创建


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


@Configuration(proxyBeanMethods = false)@ImportHttpServices(group = "weather", types = {FreeWeather.class, CommercialWeather.class})@ImportHttpServices(group = "user", types = {UserServiceInternal.class, UserServiceOfficial.class})static class HttpServicesConfiguration extends AbstractHttpServiceRegistrar {    @Bean    public 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 操作如下:


@RestControllerpublic class 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


小结


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


文章转载自:磊哥|www.javacn.site

原文链接:https://www.cnblogs.com/vipstone/p/18900774

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

还未添加个人签名 2025-04-01 加入

还未添加个人简介

评论

发布
暂无评论
重磅!SpringBoot4发布,11项重大变更全解析!_springboot_电子尖叫食人鱼_InfoQ写作社区