JDK11 升级 JDK17 最全实践干货来了( 二 )


传统写法

JDK11 升级 JDK17 最全实践干货来了

文章插图
新写法
JDK11 升级 JDK17 最全实践干货来了

文章插图
5.2.2、Text Blocks 文本块
参考: https://openjdk.org/jeps/378
通过编写 """ , 来减少转义字符和换行符,达到简化代码和提高代码可读性的目的
JDK11 升级 JDK17 最全实践干货来了

文章插图
5.2.3、Record 类型
参考: https://openjdk.org/jeps/395
record 是 JDK 14 引入的关键字,用于声明不可变的数据类 。它适用于存储纯粹的值类型数据,如接口传输数据、坐标点和只读的日志记录 。与 lombok 相比,record 简化了定义纯粹数据类型的过程 。由于 record 类是不可变的 , 成员变量只能设置一次且无法更改,无需提供显式的 setter () 方法 。
1、定义 Point 类,使用关键字 record , 未定义 get/set
JDK11 升级 JDK17 最全实践干货来了

文章插图
2、查看编译后的字节码文件
JDK11 升级 JDK17 最全实践干货来了

文章插图

JDK11 升级 JDK17 最全实践干货来了

文章插图
3、使用 Point 类
JDK11 升级 JDK17 最全实践干货来了

文章插图
5.2.4、instanceof 的模式匹配升级
  • instanceof 类型判断再也不需要强制转换
参考: https://openjdk.org/jeps/394
JDK11 升级 JDK17 最全实践干货来了

文章插图
5.2.5、密封的类和接口
参考: https://openjdk.org/jeps/409
JDK15 开始,引入了 sealed 普通类或接口类,这些类只允许被指定的类或者 interface 进行扩展和实现 。
使用修饰符 sealed,您可以将一个类声明为密封类 。密封的类使用关键字 permits 列出可以直接扩展它的类 。子类可以是最终的,非密封的或密封的
比较实用的一个特性 , 可以用来限制类的层次结构
JDK11 升级 JDK17 最全实践干货来了

文章插图
5.2.6、其他优化和升级
感兴趣的同学,推荐阅读 OpenJDK 官方文档说明,从 JDK11 到 JDK17 的改动: https://openjdk.org/projects/jdk/17/jeps-since-jdk-11
6、升级步骤6.1、JDK 选择
OpenJDK17 下载:https://jdk.java.NET/archive/
行云镜像:jdt-base-Tomcat/java-jdt-centos7.4-openjdk-17.0.2-tomcat8.0.53
6.2、pom 编译配置升级
maven 编译所需 JDK 升级至 17
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
6.3、SpringBoot 升级
SpringBoot 版本升级到 2.7.15,Spring 版本升级为 5.3.29
为什么不升级到 SpringBoot3?
Spring Boot 3.0 最低要求 Java 17,SpringBoot3.0 带来了很多变化 , 和 SpringBoot2 差异较大 。考虑到公司很多中间件都是基于 SpringBoot2 构建的,所以此处推荐升级到 SpringBoot2 的最高版本 2.7.15 。
POM 升级
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
</parent>
也可以通过设置 dependencyManagement 的方式:
<properties>
<!-- 框架版本配置-->
<springboot-version>2.7.15</springboot-version>
<springframework.version>5.3.29</springframework.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${springboot-version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${springframework.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
参考:
spring 升级指南: https://Github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions
springboot 版本官网: https://spring.io/projects/spring-boot#learn
循环依赖问题
SpringBoot 升级到 2.7.15 后,如果应用中存在循环依赖的问题,启动时会报如下错误:


推荐阅读