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

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

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

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

1.优雅版本控制

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

<span style="color:#444444"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#0000ff">import</span> org.springframework.web.bind.annotation.RequestMapping;
<span style="color:#0000ff">import</span> org.springframework.web.bind.annotation.RestController;

<span style="color:#2b91af">@RestController</span>
<span style="color:#2b91af">@RequestMapping("/api")</span>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">VersionedController</span> {

    <span style="color:#2b91af">@RequestMapping(value = "/user", version = "1")</span>
    <span style="color:#0000ff">public</span> String <span style="color:#a31515">getUserV1</span>() {
        <span style="color:#008000">// 版本1实现</span>
        System.out.println(<span style="color:#a31515">"Version 1"</span>);
        <span style="color:#0000ff">return</span> <span style="color:#a31515">"Version 1"</span>;
    }

    <span style="color:#2b91af">@RequestMapping(value = "/user", version = "2")</span>
    <span style="color:#0000ff">public</span> String <span style="color:#a31515">getUserV2</span>() {
        <span style="color:#008000">// 版本2实现</span>
        System.out.println(<span style="color:#a31515">"Version 2"</span>);
        <span style="color:#0000ff">return</span> <span style="color:#a31515">"Version 2"</span>;
    }
}
</code></span></span>

程序执行效果:

2.方便的Bean注入

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

<span style="color:#444444"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#0000ff">import</span> org.springframework.beans.factory.BeanRegistrar;
<span style="color:#0000ff">import</span> org.springframework.beans.factory.BeanRegistry;
<span style="color:#0000ff">import</span> org.springframework.context.annotation.Configuration;
<span style="color:#0000ff">import</span> org.springframework.context.annotation.Import;
<span style="color:#0000ff">import</span> org.springframework.core.env.Environment;

<span style="color:#2b91af">@Configuration</span>
<span style="color:#2b91af">@Import(MyBeansRegistrar.class)</span>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">MyConfiguration</span> {
}

<span style="color:#0000ff">class</span> <span style="color:#a31515">MyBeansRegistrar</span> <span style="color:#0000ff">implements</span> <span style="color:#a31515">BeanRegistrar</span> {

    <span style="color:#2b91af">@Override</span>
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> <span style="color:#a31515">register</span>(BeanRegistry registry,
                         Environment env) {
        registry.registerBean(<span style="color:#a31515">"user"</span>, User.class);
        <span style="color:#0000ff">if</span> (env.matchesProfiles(<span style="color:#a31515">"dev"</span>)) {
            registry.registerBean(Order.class, spec -> spec
                    .supplier(context -> <span style="color:#0000ff">new</span> <span style="color:#a31515">Order</span>(<span style="color:#a31515">"order_001"</span>)));
        }
    }
}

<span style="color:#0000ff">class</span> <span style="color:#a31515">User</span> {
    <span style="color:#0000ff">private</span> String name;
}

<span style="color:#0000ff">class</span> <span style="color:#a31515">Order</span> {
    <span style="color:#0000ff">public</span> <span style="color:#a31515">Order</span>(String name) {
        <span style="color:#0000ff">this</span>.name = name;
    }

    <span style="color:#0000ff">private</span> String name;
}
</code></span></span>

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

3.Null安全改进

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

<span style="color:#444444"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#0000ff">import</span> org.jspecify.annotations.NonNull;
<span style="color:#0000ff">import</span> org.jspecify.annotations.Nullable;

<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Person</span> {
    <span style="color:#0000ff">private</span> String name;

    <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> <span style="color:#a31515">setName</span>(<span style="color:#2b91af">@NonNull</span> String name) {
        <span style="color:#0000ff">this</span>.name = name;
    }

    <span style="color:#2b91af">@Nullable</span>
    <span style="color:#0000ff">public</span> String <span style="color:#a31515">getName</span>() {
        <span style="color:#0000ff">return</span> <span style="color:#0000ff">this</span>.name;
    }
}
</code></span></span>

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

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

4.HTTP代理轻松创建

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

<span style="color:#444444"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#2b91af">@Configuration(proxyBeanMethods = false)</span>
<span style="color:#2b91af">@ImportHttpServices(group = "weather", types = {FreeWeather.class, CommercialWeather.class})</span>
<span style="color:#2b91af">@ImportHttpServices(group = "user", types = {UserServiceInternal.class, UserServiceOfficial.class})</span>
<span style="color:#0000ff">static</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">HttpServicesConfiguration</span> <span style="color:#0000ff">extends</span> <span style="color:#a31515">AbstractHttpServiceRegistrar</span> {
    <span style="color:#2b91af">@Bean</span>
    <span style="color:#0000ff">public</span> RestClientHttpServiceGroupConfigurer <span style="color:#a31515">groupConfigurer</span>() {
        <span style="color:#0000ff">return</span> groups -> groups.filterByName(<span style="color:#a31515">"weather"</span>, <span style="color:#a31515">"user"</span>)
                .configureClient((group, builder) -> builder.defaultHeader(<span style="color:#a31515">"User-Agent"</span>, <span style="color:#a31515">"My-Application"</span>));
    }
}
</code></span></span>

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
    public 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 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

meslog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值