重磅!SpringBoot4发布,11项重大变更全解析!
不知道大家最近没有发现?在我们新创建 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.其他七个变更
其他升级的特性还包括:
SPEL 表达式升级:SPEL 表达式中支持空安全和 Elvis 运算符,例如以下代码:
@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 操作如下:
@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");
}
}
功能删除:新版本中的删除的内容如下:
- 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、多模态、向量数据库、嵌入模型等内容。
重磅!SpringBoot4发布,11项重大变更全解析!的更多相关文章
- 【转载】最强NLP预训练模型!谷歌BERT横扫11项NLP任务记录
本文介绍了一种新的语言表征模型 BERT--来自 Transformer 的双向编码器表征.与最近的语言表征模型不同,BERT 旨在基于所有层的左.右语境来预训练深度双向表征.BERT 是首个在大批句 ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 掌握11项技能,你就是优秀的前端开发project师
导读: 你或许会认为前端开发是一个非常easy的工作,对呀,你就是刚刚从网页设计转型过来的.但当你深入当中时,一定会发现好像前端开发不是那么简单,光站点性能优化.响应式.框架就让你焦头烂额, 确实,做 ...
- tfs如何为工作项添加变更集
今天工作中遇到的,可惜之前没怎么用过TFS. 我这是最后一次签入的时候关联了工作项.目的是要把先前签入的绑定到该任务上. 团队自愿管理器->查找历史记录->双击最后一次绑定工作项的变更集- ...
- Storyboard 全解析
XCode 4.3.2 新功能 - Storyboard 最近开始比较有空在玩 XCode 4.3.2,赫然发现它多了个 Storyboard 的东东. Storyboard 这个东西一般来说是在做创 ...
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
- 【ABAP系列】SAP ABAP替代校验全解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP替代校验全解析 ...
- 【转载】Fragment 全解析(1):那些年踩过的坑
http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使 ...
- Oracle AWR报告指标全解析-11011552
1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...
- Java生鲜电商平台-电商订单系统全解析
Java生鲜电商平台-电商订单系统全解析 说明:Java生鲜电商平台-电商订单系统全解析主要讲解OMS的内容,设计,开发,架构等知识. 今天分享将会分为以下三个环节来阐述: 1.订单系统的介绍 2.订 ...
随机推荐
- 【论文随笔】基于会话的推荐系统构建方法调查(Survey On Methods For Building Session-Based Recommender Systems)
前言 今天读的论文为一篇于2023年发表在国际开放信息技术杂志(International Journal of Open Information Technologies)的论文,文章是关于构建基于 ...
- 记录-C#给图片增加文字
业务需要动态给图片增加文字(书本的封面图片),修改字体大小.字体.颜色.控制位置 测试代码: 1 string path = @"E:\cover.png"; 2 3 Bitmap ...
- python 更新pip镜像源
前言 默认情况下 pip 使用的是国外的镜像,在下载的时候速度非常慢,下载速度是几kb或者几十kb,花费的时间比较长. 解决办法 国内目前有些机构或者公司整理了对应的镜像源,使得通过内网就能访问即可, ...
- VRRP+BFD实验
VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)的工作原理主要涉及多个路由器(或具备路由功能的设备)协同工作,通过VRRP报文和优先级机制来选举出一 ...
- vue实现不同用户权限的方法
Vue 实现不同用户权限的方法 在项目中,实现不同用户的权限控制是常见的需求也是常见的功能模块,例如管理系统中不同角色(管理员.普通用户等)应有不同的访问权限,小程序.App等在不同角色登入的时候显示 ...
- [源码系列:手写spring] IOC第十二节:FactoryBean
内容介绍 在 Spring 框架中,FactoryBean 是一个特殊的工厂类接口,用于创建和管理复杂的 bean 对象.它允许你自定义 bean 的创建逻辑,并且可以在 bean 创建过程中执行一些 ...
- [每日算法] leetcode第1题:两数之和
leetcode第1题入口 知识点 寻找循环体中目标值之间的关系来减少循环层数 (利用关系建立查找对方的数据结构来空间换时间) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请 ...
- 【Python】PDF文档导出指定章节为TXT
PDF文档导出指定章节为TXT 需求 要导出3000多个pdf文档的特定章节内容为txt格式(pdf文字可复制). 解决 导出PDF 查了一下Python操作PDF文档的方法,主要是通过3个库,PyP ...
- 古老的BAT文件在windows下的编辑
直接上代码 rem echo choice /t 20 /d y /n >nul rem start/d "E:\service\exe" 8091.exe 8091 sta ...
- Hystrix两种隔离方式对比
在微服务架构中,我们不可避免的与Hystrix打交道,最近在面试过程中,也总是被问到Hystrix两种熔断方式的区别,今天,就给大家做个小结. 首先,Hystrix熔断方式主要有两种: 线程池隔离 ...