重磅!SpringBoot4发布了!

向量数据库大模型微服务

picture.image

快看这个宝藏网站(面试、工作内推、技术分享什么都有):http://www.susan.net.cn

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

picture.image

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

picture.image

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

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

程序执行效果:

picture.image

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

picture.image

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;  
    }  
  
    @Nullable  
    public String getName() {  
        returnthis.name;  
    }  
}  

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

picture.image

不同 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 技术,将应用编译成原生镜像,极大地缩短了启动时间。

  1. 支持 Jackson 3.x :放弃对 Jackson 2.x 的支持,升级为 Jackson 3.x。
  2. Servlet 和 WebSocket 版本升级 :使用 Servlet 6.1 和 WebSocket 2.2 作为 Web 应用程序的底层实现,这意味着应用程序应该部署在最新的 Servlet 容器上,比如 Tomcat 11+ 和 Jetty 12.1+。
  3. 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");  
    }  
}  

  1. 功能删除 :新版本中的删除的内容如下:
  • 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

小结

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

最后欢迎加入苏三的星球,你将获得:商城微服务实战、AI开发项目课程、苏三AI项目、秒杀系统实战、商城系统实战、秒杀系统实战、代码生成工具、系统设计、性能优化、技术选型、底层原理、Spring源码解读、工作经验分享、痛点问题、面试八股文等多个优质专栏。

还有1V1答疑、修改简历、职业规划、送书活动、技术交流。

扫描下方二维码,即可加入星球:

picture.image

目前星球已经更新了5200+篇优质内容,还在持续爆肝中.....

星球已经被官方推荐了3次,收到了小伙伴们的一致好评。戳我加入学习,已有1700+小伙伴加入学习。

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
高性能存储虚拟化方案 NVMe over Fabric 在火山引擎的演进
在云计算中,虚拟化存储扮演着重要角色,其中 iSCSI 协议在业界开放、流行多年。近年来,拥有更优性能的 NVMe over Fabrics 协议也得到了发展。本次分享介绍了 NVMe over Fabrics 在云原生和虚拟化方向的演进工作和成果。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论