SpringBoot4发布:11大变化全解析!

255 阅读3分钟

SpringBoot4发布:11大变化全解析!

你们最近都注意到了吗?当我们创建一个新的SpringBoot项目时,现在有一个SpringBoot4.0.0预览的选项,如下图所示:

None

Springboot4构建在全新的Spring Framework 7.0.0上,如下图所示:

None

那么,问题来了:新版本有哪些重要的变化?接下来,让我给你一个先睹为快。

1.优雅的版本控制

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

Copyimport 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() {
        // Version 1 implementation
        System.out.println("Version 1");
        return "Version 1";
    }
​
    @RequestMapping(value = "/user", version = "2")
    public String getUserV2() {
        // Version 2 implementation
        System.out.println("Version 2");
        return "Version 2";
    }
}

程序执行效果:

None

2.方便豆注射液

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

Copyimport 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可以正常使用:

None

3.空安全改进

新版本采用JSpecify注释来声明其API的空安全性,使用@Nullable表示值可以为空,使用@NonNull表示值不能为空。这与IntelliJ IDEA结合使用,以提供警告或错误消息,如以下代码所示:

Copyimport 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;
    }
}

警告消息在IntelliJ IDEA中也是可见的:

None

显示格式因不同的IDEA版本而异;作者使用的是IDEA 2024,因为需要更新的版本才能支持新功能。

4.轻松创建HTTP代理

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

Copy@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.其他七个变化

其他升级功能包括:

  • SPEL表达式升级:SPEL表达式现在支持空安全和Elvis运算符,如以下代码所示:
Copy@Value("#{systemProperties['pop3.port'] ?: 25}")

这将注入pop3.port系统属性的值,或者如果属性未定义,则注入值25

  • GraalVM原生应用程序支持:使用Spring AOT技术,应用程序可以编译成原生映像,从而显著减少启动时间。
  • 对杰克逊3.x的支持:对杰克逊2.x的支持已被删除,并升级到杰克逊3.x。
  • Servlet和WebSocket版本升级:它使用Servlet 6.1和WebSocket 2.2作为Web应用程序的底层实现。这意味着应用程序应该部署在最新的Servlet容器上,例如Tomcat 11+和Jetty 12.1+。
  • HttpHeaders优化:HttpHeaders操作如下:
Copy@RestController
public class MyController {
​
 @GetMapping("/headers")
 public ResponseEntity<String> handleRequest(HttpHeaders headers) {
 // Old way (deprecated)
 // headers.getFirst("X-Custom-Header");// New way
 String value = headers.firstValue("X-Custom-Header").orElse(null);
​
 // Iterate over all headers
 headers.forEach((name, values) -> {
 System.out.println(name + ": " + values);
 });
​
 return ResponseEntity.ok("Processed");
 }
}
  • 功能移除:

新版本中删除了以下内容:

  1. Spring MVC的XML配置命名空间现在已弃用,转而支持Java配置。
  1. Spring TestContext Framework中的JUnit 4支持现在已弃用。

3.反对使用jackson2.x支持,转而支持jackson3.x。

  1. Spring JCL已停产。
  • 最低环境要求:

Jakarta EE 11(Tomcat 11+)

koliten2.x

JSONassert 2.0发布

GraalVM 23的

更多升级信息,请参考官方网站:

https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-7.0-Release-Notes.

总结

编程是一个终身学习的职业。框架和工具的变化意味着我们得到了更方便和用户友好的方法,这对开发人员来说是有益的。