SpringBoot3正式版将于11月24日发布:都有哪些新特性?
从 2018 年 2 月 28 号发布 Spring Boot 2.0 版本开始,整个 2.X 版本已经经过了 4 年多的时间,累计发布了 95 个不同的版本,而就在前不久,2.X 系列的也已经迎来了他的最终版本:2.7。
前几天我还写了一篇关于 Spring Boot 从 2.1 版本升级到 2.7 的文章,而现在,Spring Boot 3.0 也要来了!
时间就定在本月的 24 号,Spring Boot 将要发布 3.0 的最终 RELEASE 版本。
截止到现在为止,Spring Boot3已经发布了 6 个版本,累计 5 个里程碑版本,2 个 RC 候选版,现在就跟着我一起看下 Spring Boot 3.0 将会要哪些重大的变化。
JAVA 17
对于我们比较关注的第一个最重要的事情就是,Spring Boot3 版本最低支持 Java17,还在万年 Java8 的同学,该升级就升级了吧,这里介绍一下关于 Java17 之后的一些重要改变。
record
record 是在 Java14中引入的,https://openjdk.org/jeps/395 。
以前我们写一个类需要写一堆 get、set 方法,后来有了lombok
之后这些都省了,现在 Java 给我们提供了原生的写法。
public record User() {}
本质上 record 修饰之后的类就是一个 final 类,而且他的父类不是 Object,也不是余某军,而是 java.lang.Record
。
record 类属性只能声明在头部,所有的成员变量都是 public final 的,而且只能声明静态属性,但是可以声明成员方法和静态方法。
public record User(String username) {
static int id;
public String getName(){
return this.username;
}
}
text blocks
text blocks 文本块是在 Java13 引入的,并且在 Java15 版本成为永久特性,https://openjdk.org/jeps/378。
以前我们复制一个多行的字符串到 Java 里,会自动加上行终止符。
String sql = "SELECT\n" +
"\t* \n" +
"FROM\n" +
"\tsys_user0 \n" +
"WHERE\n" +
"\tuser_name = 'abc'";
而有了文本块的功能之后,可以帮助我们更方便的定义包含多行文本的字符串字面量,他使用三引号作为开始和结束的分隔符。
String sqlBlock = """
SELECT
*
FROM
sys_user0
WHERE
user_name = 'abc'
""";
switch表达式
switch表达式是在 Java12 中引入的,在 Java14 成为永久特性,https://openjdk.org/jeps/361。
升级后的 switch 其实包含两个特性,一个是允许 case 使用多个常量,另外一个就是有返回值。
新增case x->
语法,使用方面更加简洁,而且不需要再每个 case 写一个 break了。
String name = "xiao";
int ret = switch (name) {
case "ai" -> 1;
case "xiao", "xian" -> 2;
default -> 0;
};
Pattern Matching 模式匹配
模式匹配可以帮助我们简化instanceof
代码。
if (obj instanceof String s) {
System.out.println(s.toLowerCase());
}
还可以在 switch-case 语句使用:
static double getDoubleUsingSwitch(Object o) {
return switch (o) {
case Integer i -> i.doubleValue();
case Float f -> f.doubleValue();
case String s -> Double.parseDouble(s);
default -> 0d;
};
}
sealed 密封类
sealed 在 Java15中引入,在 Java17成为永久特性。
sealed 密封类的主要作用就是限制类的继承。
比如我们有 Animal类,Dog 和 Cat 分别继承它,实现了 eat 方法,他们吃的动作是不一样的,但是我们不希望人能继承 Animal,不允许他去继承动物吃的行为,就可以像下面这样通过 sealed 和 permits 关键字限制它是一个密封类,只有猫和狗能够继承它。
需要注意,父类被定义为 sealed 之后,子类必须是 sealed、 non-sealed 或者 final。
public abstract sealed class Animal permits Cat, Dog {
public abstract void eat();
}
public non-sealed class Dog extends Animal{
@Override
public void eat() {
System.out.println("dog eat");
}
}
public non-sealed class Cat extends Animal{
@Override
public void eat() {
System.out.println("cat eat");
}
}
Jakarta EE 9
另外一个很重要的变化就是本次升级之后,最低只支持 Jakarta EE 9,使用 Servlet5.0 和 JPA3.0 规范,不过最新版本RC2已经升级到了 JakartaEE 10,默认使用 Servlet6.0 和 JPA3.1 规范。
有些同学可能连 Jakarta 是什么都不知道,这个英文单词是印尼首都雅加达的意思,其实就是我们知道的 JavaEE 改名之后就叫 JakartaEE,比如我们之前的javax.servlet
包现在就叫jakarta.servlet
。
也因此,代码中所有使用到比如 HttpServletRequest 对象的 import 都需要修改。
import javax.servlet.http.HttpServletRequest;
改为
import jakarta.servlet.http.HttpServletRequest;
Spring Native
Spring Native 也是升级的一个重大特性,支持使用 GraalVM 将 Spring 的应用程序编译成本地可执行的镜像文件,可以显著提升启动速度、峰值性能以及减少内存使用。
我们传统的应用都是编译成字节码,然后通过 JVM 解释并最终编译成机器码来运行,而 Spring Native 则是通过 AOT 提前编译为机器码,在运行时直接静态编译成可执行文件,不依赖 JVM。
关于 AOT 技术,在我之前写过的文章中有提及到:这样优化Spring Boot,启动速度快到飞起!。
演示
这里我简单演示一下怎么使用,首先我们需要做一些准备工作:
- https://www.graalvm.org/downloads/ 下载GraalVM,指定
JAVA_HOME
,export JAVA_HOME=/Users/user/Desktop/graalvm-ce-java17-22.3.0/Contents/Home - 下载个新一点的 IDEA,比如我使用的是最新的 EAP 版本
- 下载个新一点的 JDK,比如使用 JDK17
然后通过 Spring Initialzr 创建一个新项目,使用最新版本Spring Boot 3.0.0-SNAPSHOT,勾选GraalVM Native Support
,创建好项目之后添加一个测试的Controller
。
@RestController
public class TestController {
@GetMapping("/")
public String hello(){
return "GraalVM ...";
}
}
然后直接运行程序,发现启动时间花费了大概 1 秒。
然后执行命令,生成镜像文件:
./gradlew nativeCompile
这个过程挺耗时的,花了大概 2 分多钟才生成好。
最后执行命令:
./build/native/nativeCompile/demo2
我们看到,最终启动时间是 0.082 秒,快了 10 多倍。
这里我使用的是 gradle,如果使用 maven 的话,使用如下的命令:
1. mvnw -Pnative native:compile
2. ./target/demo2
其他依赖升级
Spring Boot 3 最低依赖 Spring6 版本,因此对应的 Spring 版本也该换了(不会有人还在用 Spring2 的吧),其他的依赖升级如下:
- Kotlin 1.7+
- Lombok 1.18.22+ (JDK17 support支持版本)
- Gradle 7.3+
另外我想说的是,SpringBoot2.7引入了新的自动装配方式META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
,原来的写法spring.factories
在 3.0 版本以下还能兼容,3.0 新版本之后,老的写法spring.factories
不能使用了,中间件相关的开发同学要注意了。
其他一些关于配置的变化,Spring MVC 的一些小变化就不说了,更新日志到时候都可以看到。
最后,如果想升级的话,在新版本发布之后,会有一个基于Spring Boot 2.7 版本的迁移指南。
参考:
SpringBoot3正式版将于11月24日发布:都有哪些新特性?的更多相关文章
- 微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版
微软今天发布了Visual Studio 2022 最接近正式发布的RC版本,同时宣布在11月8日发布正式版,届时将在线上发布虚拟的发布活动,具体参见:https://devblogs.microso ...
- [转帖]ARM A77+G77最强公版架构:联发科5G SoC计划11月26日发布
ARM A77+G77最强公版架构:联发科5G SoC计划11月26日发布 https://www.cnbeta.com/articles/tech/909025.htm 主流的手机SoC厂商已经纷纷 ...
- 2016年11月24日 星期四 --出埃及记 Exodus 20:15
2016年11月24日 星期四 --出埃及记 Exodus 20:15 "You shall not steal.不可偷盗.
- 键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写
/* 键盘和鼠标闲置超时时关闭显示器并锁定电脑桌面的AutoHotkey脚本 2019年11月24日写 在电脑桌面锁定时移动鼠标就会显示登录界面,此时即使超过电源设置的时间电脑也不会关闭显示器使得屏幕 ...
- .NET 5.0 RC2 发布,正式版即将在 11 月 .NET Conf 大会上发布
原文:http://dwz.win/ThX 作者:Richard 翻译:精致码农-王亮 说明:本译文舍弃了少许我实在不知道如何翻译但又不是很重要的语句. 今天(10月13日)我们发布了 .NET 5. ...
- [svc]linux常用手头命令-md版-2017年11月12日 12:31:56
相关代码 curl命令-网站如果3次不是200或301则报警 curl -o /dev/null -s -w "%{http_code}" baidu.com -k/--insec ...
- 2016年11月24日--面向对象、C#小复习
面对对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象.对同类对象抽象出其共性,形成类.类中的大多数数据,只能用本类的方法进行处理.类通过一个简单的外部接口与外界发生关系,对象 ...
- 11月24日 layouts and rendering in rails(部分没有看)
http://guides.rubyonrails.org/layouts_and_rendering.html 中文 This guide covers the basic layout feat ...
- 2016年11月8日 星期二 --出埃及记 Exodus 19:24
2016年11月8日 星期二 --出埃及记 Exodus 19:24 The LORD replied, "Go down and bring Aaron up with you. But ...
- MySQL 8.0 正式版 8.0.11 发布:比 MySQL 5.7 快 2 倍
ySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8. ...
随机推荐
- windows系统-不能打印问题:PDF打印软件正常打开PDF文件,点击打印后软件卡死并提示未响应(No response)
电脑突然出现PDF软件卡死问题,导致无法打印:初步思路记录: 导致问题出现的原因可能为文件问题(文件过大,打印机容量小).打印机问题(打印机未连接.故障等).电脑驱动问题(打印机驱动损坏).电脑补丁问 ...
- sql报错收集
踩坑记录: 当出现如下错误 Not enough parameters for the SQL statement 多半是因为插入时填写的字段名有误 json.decoder.JSONDecodeEr ...
- KingbaseES V8R6 锁等待检测
背景 对于多数数据库,dba技能之一就是查找锁.锁的存在有效合理的在多并发场景下保证业务有序进行.下面我们看一下KingbaseESV8R6中查找阻塞的方法. 1.找到"被阻塞者" ...
- 网络基础七层模型与TCP/IP协议
1.网络基础 1.1 什么是网络 网络就是计算机网络是一组计算机或网络设备通过有形 的线缆或无形的媒介如无线,连接起来,按照一定的 规则,进行通信的集合. 网络通信就是指终端设备之间通过计算机网络进行 ...
- ProxySQL(9):ProxySQL的查询缓存功能
文章转载自: https://www.cnblogs.com/f-ck-need-u/p/9314459.html ProxySQL支持查询缓存的功能,可以将后端返回的结果集缓存在自己的内存中,在某查 ...
- 使用mysql5.7版本的mysqldump备份mysql8.0版本的数据库报错解决办法
使用mysql5.7版本的mysqldump命令执行备份mysql8.0版本的数据库时会报错: mysqldump: Couldn't execute 'SET SQL_QUOTE_SHOW_CREA ...
- 使用工具SecureCRT通过ssh远程连接Windows server 2019
Windows Server 2019 开通SSH Server服务 在需要安裝的ws2019开启powershell,执行安装 openssh server 指令 Add-WindowsCapabi ...
- core-js/modules/es.error.cause.js 报错
解决方法: 1.先删除 node_modules 依赖 npm rm -rf node_modules 2.首先安装 报错的插件 npm install --save core-js 3.最后再 np ...
- 线性回归大结局(岭(Ridge)、 Lasso回归原理、公式推导),你想要的这里都有
本文已参与「新人创作礼」活动,一起开启掘金创作之路. 线性模型简介 所谓线性模型就是通过数据的线性组合来拟合一个数据,比如对于一个数据 \(X\) \[X = (x_1, x_2, x_3, ..., ...
- 关于aws上ec2机型的种类总结汇总
在aws上ec2的机型是非常多的,但主要的种类为如下几种 General Purpose (通用型) ...