前言
从 jdk8
一直坚挺的使用过来,用了很多年了也已经非常习惯和了解了。为什么我现在要升级 jdk17
呢?由于连带的框架的升级,springboot2
,到 springboot3
,所需要的版本也在不断的限制,放弃了原有的 jdk8
。jdk17
引入了许多实用的新特性,使代码更简洁、易读、易维护. 在性能上也有显著的改善。
语法糖变化
多行的字符串(Java 13/15)
之前我们标识字符内容里面总有烦人的\"
来转义引号。在新语法下,可以直接使用 """
来前后包裹字符串.可以非常轻松的表达。看起来也不会那么的乱七八糟。对我来说还是很好用,尤其是对 json
数据处理格外的明显。
python
"""
{"code":200,"msg":"成功","data":{"total":0,"data":[]}}
"""
switch 的表达式(Java 12 / 13)
可以直接使用箭头来表达,避免了break
的问题,增加了返回值的表达式
arduino
String day = switch (dayOfWeek) {
case MONDAY, TUESDAY -> "工作日";
case SATURDAY, SUNDAY -> "周末";
default -> throw new IllegalStateException("未知日期");
};
模式的匹配(Java 16)
传统的类型检查,我们经常需要两步,判断对象是否属于某个类型,然后在强制类型的转换
ini
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.toUpperCase());
}
但是在 jdk16
之后,可以直接一步到位
javascript
if (obj instanceof String s) {
System.out.println(s.toUpperCase()); // s 已经自动转换为 String 类型
}
记录类record
创建一个 record
类, 会自动帮我们创建equals()
/ hashCode()
/ toString()
/ get方法
。
注意:所有字段都是 final
类型,且提供了全参构造函数 。 但不可以继承哦
arduino
record Point(int x, int y) {}
推荐使用场景为: 只需要一个不可变的数据类(DTO、POJO、VO
等)的时候
JDK 17 API上的升级
- 移除了部分旧 API
javax.xml.bind
(JAXB)不再内置 → 需手动添加依赖(如用于 SOAP 或 XML 序列化)java.corba
,java.transaction
等模块被移除
- 强封装了内部的API
- JDK 17 默认禁止反射访问
sun.*
、jdk.internal.*
等包 - 某些旧库(尤其通过反射操作
Unsafe
的)会出错
框架和依赖上的变化
springboot 框架
我们常用的springboot
框架,从之前版本 2 到了现在的版本 3.
比较重大的变化就是 Jakarta EE 9+ 命名空间变更
,包名从 javax.*
变为 jakarta.*
rust
javax.persistence.* -> jakarta.persistence.*
javax.validation.* -> jakarta.validation.*
javax.servlet.* -> jakarta.servlet.*
javax.annotation.* -> jakarta.annotation.*
javax.transaction.* -> jakarta.transaction.*
mybatisplus
从原先的mybatis-plus-boot-starter
依赖包替换成 mybatis-plus-spring-boot3-starter
mysql 驱动
可以使用新命名:mysql-connector-j
,但连接配置保持不变,
bash
spring.datasource.url=jdbc:mysql://localhost:3306/db?useSSL=false&serverTimezone=UTC
jwt
依赖模块的io.jsonwebtoken:jjwt
, 拆分为多个模块(jjwt-api
, jjwt-impl
, jjwt-jackson
等)
xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>1.0.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>1.0.0</version>
<scope>runtime</scope>
</dependency>
代码语法构造上的一些调整:
scss
Jws<Claims> jws = Jwts.parser()
.verifyWith(secretKey)
.build()
.parseSignedClaims(token);
总结
使用了多年的java8,在面对不断更新的jdk和springboot,为了更好的适配新的AI,我们还是尽量选择拥抱新技术,当然历史项目的沉重包袱确实很难一下子卸下,需要慢慢过渡。新技术的使用最好还是应用在新项目上的尝试和体验。