從java8升級java17的一些調(diào)整總結(jié)
前言
從 jdk8 一直堅挺的使用過來,用了很多年了也已經(jīng)非常習(xí)慣和了解了。為什么我現(xiàn)在要升級 jdk17 呢?由于連帶的框架的升級,springboot2,到 springboot3,所需要的版本也在不斷的限制,放棄了原有的 jdk8。jdk17引入了許多實用的新特性,使代碼更簡潔、易讀、易維護. 在性能上也有顯著的改善。
語法糖變化
多行的字符串(Java 13/15)
之前我們標(biāo)識字符內(nèi)容里面總有煩人的\" 來轉(zhuǎn)義引號。在新語法下,可以直接使用 """ 來前后包裹字符串.可以非常輕松的表達??雌饋硪膊粫敲吹膩y七八糟。對我來說還是很好用,尤其是對 json數(shù)據(jù)處理格外的明顯。
"""
{"code":200,"msg":"成功","data":{"total":0,"data":[]}}
"""
switch 的表達式(Java 12 / 13)
可以直接使用箭頭來表達,避免了break的問題,增加了返回值的表達式
String day = switch (dayOfWeek) {
case MONDAY, TUESDAY -> "工作日";
case SATURDAY, SUNDAY -> "周末";
default -> throw new IllegalStateException("未知日期");
};
模式的匹配(Java 16)
傳統(tǒng)的類型檢查,我們經(jīng)常需要兩步,判斷對象是否屬于某個類型,然后在強制類型的轉(zhuǎn)換
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.toUpperCase());
}
但是在 jdk16 之后,可以直接一步到位
if (obj instanceof String s) {
System.out.println(s.toUpperCase()); // s 已經(jīng)自動轉(zhuǎn)換為 String 類型
}
記錄類record
創(chuàng)建一個 record 類, 會自動幫我們創(chuàng)建equals() / hashCode() / toString()/ get方法。
注意:所有字段都是 final 類型,且提供了全參構(gòu)造函數(shù) 。 但不可以繼承哦
record Point(int x, int y) {}
推薦使用場景為: 只需要一個不可變的數(shù)據(jù)類(DTO、POJO、VO 等)的時候
JDK 17 API上的升級
- 移除了部分舊 API
javax.xml.bind(JAXB)不再內(nèi)置 → 需手動添加依賴(如用于 SOAP 或 XML 序列化)java.corba,java.transaction等模塊被移除
- 強封裝了內(nèi)部的API
- JDK 17 默認禁止反射訪問
sun.*、jdk.internal.*等包 - 某些舊庫(尤其通過反射操作
Unsafe的)會出錯
框架和依賴上的變化
springboot 框架
我們常用的springboot框架,從之前版本 2 到了現(xiàn)在的版本 3.
比較重大的變化就是 Jakarta EE 9+ 命名空間變更 ,包名從 javax.* 變?yōu)?jakarta.*
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 驅(qū)動
可以使用新命名:mysql-connector-j,但連接配置保持不變,
spring.datasource.url=jdbc:mysql://localhost:3306/db?useSSL=false&serverTimezone=UTC
jwt
依賴模塊的io.jsonwebtoken:jjwt , 拆分為多個模塊(jjwt-api, jjwt-impl, jjwt-jackson 等)
<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>
代碼語法構(gòu)造上的一些調(diào)整:
Jws<Claims> jws = Jwts.parser()
.verifyWith(secretKey)
.build()
.parseSignedClaims(token);
總結(jié)
使用了多年的java8,在面對不斷更新的jdk和springboot,為了更好的適配新的AI,我們還是盡量選擇擁抱新技術(shù),當(dāng)然歷史項目的沉重包袱確實很難一下子卸下,需要慢慢過渡。新技術(shù)的使用最好還是應(yīng)用在新項目上的嘗試和體驗。
相關(guān)文章
mybatis Interceptor對UpdateTime自動處理的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于使用mybatis Interceptor對UpdateTime自動處理的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2018-12-12
IDEA連接mysql數(shù)據(jù)庫報錯的解決方法
這篇文章主要介紹了IDEA連接mysql數(shù)據(jù)庫報錯的解決方法,文中有非常詳細的圖文示例,對出現(xiàn)Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezone‘ prope報錯的小伙伴們很有幫助喲,需要的朋友可以參考下2021-05-05
如何使用stream從List對象中獲取某列數(shù)據(jù)
這篇文章主要介紹了如何使用stream從List對象中獲取某列數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Spring Cloud 2026 網(wǎng)關(guān)模式實現(xiàn)示例
本文主要介紹了Spring Cloud 2026 網(wǎng)關(guān)模式實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
SpringBoot實現(xiàn)動態(tài)端口切換黑魔法
這篇文章主要為大家詳細介紹了SpringBoot如何實現(xiàn)動態(tài)端口切換黑魔法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
java小知識之查詢數(shù)據(jù)庫數(shù)據(jù)的元信息
這篇文章主要給大家介紹了關(guān)于java小知識之查詢數(shù)據(jù)庫數(shù)據(jù)的元信息,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-10-10

