最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?21現(xiàn)代進(jìn)化實戰(zhàn)之如何用Records和模式匹配終結(jié)代碼臃腫

 更新時間:2026年04月20日 11:20:53   作者:湮酒  
這篇文章主要介紹了Java?21現(xiàn)代進(jìn)化實戰(zhàn)之如何用Records和模式匹配終結(jié)代碼臃腫的相關(guān)資料,Record模式匹配是Java 21中最引人注目的特性之一,它擴(kuò)展了Java 16引入的Record功能,使其能夠與模式匹配結(jié)合使用,需要的朋友可以參考下

前言:告別 Java 的“八股文”時代

曾幾何時,寫 Java 被戲稱為“敲擊鍵盤的體力活”。為了定義一個簡單的承載數(shù)據(jù)的 DTO,我們需要忍受冗長的構(gòu)造函數(shù)、重復(fù)的 Getter/Setter,以及那永遠(yuǎn)寫不完的 equals()hashCode()。而在處理多態(tài)邏輯時,我們又不得不深陷 instanceof 加強制類型轉(zhuǎn)換的“類型泥潭”。

Java 21 的發(fā)布,標(biāo)志著這門老牌語言完成了從“命令式繁瑣”向“聲明式精簡”的代際跨越。其中的 Records模式匹配(Pattern Matching) 并非簡單的語法糖,它們是 Java 重新定義數(shù)據(jù)模型邏輯分支的物理核心。今天,我們將拆解這兩大特性的底層二進(jìn)制契約,看看它們?nèi)绾卧?Spring Boot 項目中像手術(shù)刀一樣精準(zhǔn)地切掉 30% 的冗余代碼,讓你的程序回歸邏輯本身。

一、 數(shù)據(jù)的“凈身出戶”:深度理解 Record 的物理內(nèi)核

在 Java 21 之前,我們習(xí)慣于用 Lombok 或手動編寫 POJO。但在 JVM 的視角下,這些類都是“重型裝甲”,帶有復(fù)雜的繼承鏈和可變狀態(tài)。

1.1 從“狀態(tài)機(jī)”向“數(shù)據(jù)載體”的范式轉(zhuǎn)移

Record 的引入,本質(zhì)上是為 Java 引入了名義積類型(Nominal Product Types)。

  • 物理約束:Record 聲明后,其字段是 private final 的,類本身也是 final 的。這意味著一旦創(chuàng)建,它的物理內(nèi)存快照就是不可變的。
  • 編譯器契約:當(dāng)你寫下 record User(String name, int age) {} 時,編譯器會自動在字節(jié)碼層面生成規(guī)范構(gòu)造函數(shù)(Canonical Constructor)、成員變量以及所有標(biāo)準(zhǔn)的 Object 方法。這不僅是少寫了代碼,更重要的是它向 JVM 傳遞了一個明確的信號:這是一個純粹的數(shù)據(jù)結(jié)構(gòu),可以進(jìn)行高強度的 JIT 優(yōu)化。

1.2 內(nèi)存布局與性能紅利

傳統(tǒng)的 Class 對象在堆內(nèi)存中會有較重的對象頭(Object Header)和填充(Padding)。

  • JIT 壓榨:由于 Record 的字段是不可變的且結(jié)構(gòu)固定,JIT 編譯器可以更容易地進(jìn)行逃逸分析(Escape Analysis)標(biāo)量替換(Scalar Replacement)。在某些高頻創(chuàng)建 DTO 的場景下,Record 的物理執(zhí)行效率比傳統(tǒng)的 Class 要高出 10%-15%。

二、 Spring Boot 生產(chǎn)實戰(zhàn):用 Record 重塑 DTO 體系

在 Spring Boot 開發(fā)中,DTO(數(shù)據(jù)傳輸對象)占據(jù)了代碼庫 40% 的類文件。我們來看看 Java 21 是如何實現(xiàn)“降維打擊”的。

2.2 Jackson 與序列化的無縫銜接

很多同學(xué)擔(dān)心 Record 的 Getter 方法名不是標(biāo)準(zhǔn)的 getXXX()(而是 xxx()),會不會導(dǎo)致 JSON 序列化失???

  • 答案是:完全不用擔(dān)心。Jackson 2.12+ 已經(jīng)完美支持 Record。它通過反射 Record 的組件描述符(Component Descriptors)直接獲取屬性,不再依賴 JavaBean 規(guī)范。這物理性地消除了對 Lombok 的強依賴。

代碼實戰(zhàn):極簡的 API 響應(yīng)模型定義

/* ---------------------------------------------------------
   代碼塊 1:面向 Java 21 的 Spring Boot 響應(yīng)體建模
   邏輯:利用 Record 實現(xiàn)不可變、強一致性的數(shù)據(jù)契約
   --------------------------------------------------------- */
package com.csdn.tech.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 訂單詳情響應(yīng)模型
 * 物理特性:自帶構(gòu)造函數(shù)、組件訪問器、全字段 final
 */
@Schema(description = "訂單詳情信息")
public record OrderResponse(
    @Schema(example = "ORD_20241024")
    String orderId,
    
    @NotBlank
    String customerName,
    
    List<OrderItemRecord> items,
    
    LocalDateTime createTime
) {
    // 1. 緊湊型構(gòu)造函數(shù):執(zhí)行物理校驗邏輯
    public OrderResponse {
        if (items == null || items.isEmpty()) {
            throw new IllegalArgumentException("訂單項不能為空");
        }
        // 自動完成字段賦值,無需寫 this.x = x
    }

    // 2. 派生屬性:邏輯計算
    public double totalAmount() {
        return items.stream().mapToDouble(OrderItemRecord::price).sum();
    }
}

/**
 * 嵌套的 Record 模型
 */
record OrderItemRecord(String sku, double price, int quantity) {}

三、 模式匹配(Pattern Matching):終結(jié)類型強轉(zhuǎn)的“死亡嵌套”

如果說 Record 解決了數(shù)據(jù)定義的問題,那么模式匹配則徹底重構(gòu)了我們處理復(fù)雜邏輯分支的方式。

3.1 物理層面的“類型解耦”

傳統(tǒng)的 if (obj instanceof String) 邏輯后,必須緊跟一行 String s = (String) obj;

  • 痛點:這種“檢查+強轉(zhuǎn)”的二段式操作是非原子的。如果在檢查和強轉(zhuǎn)之間,變量的物理指向發(fā)生了改變(雖然在單線程下很難,但在邏輯語義上是不嚴(yán)謹(jǐn)?shù)模?,就會引發(fā)災(zāi)難。
  • Java 21 的解法:模式匹配將“判定”與“提取”物理合并。當(dāng)判定成功時,變量已經(jīng)被自動解構(gòu)并綁定到了局部作用域。

3.2 密封類(Sealed Classes)的邏輯閉環(huán)

模式匹配最強大的搭檔是 Sealed Classes。

  • 數(shù)學(xué)契約:通過 sealed 關(guān)鍵字,我們可以限制一個接口只有特定的幾個實現(xiàn)。
  • 窮舉檢查:在 switch 模式匹配中,編譯器會物理檢查你是否覆蓋了所有可能的情況。如果不覆蓋,編譯直接報錯。這徹底消除了 default: throw new IllegalStateException() 這種丑陋的兜底邏輯。

四、 深度對壘:Switch 模式匹配與傳統(tǒng)多態(tài)的邏輯博弈

在復(fù)雜的業(yè)務(wù)系統(tǒng)(如支付、促銷策略)中,我們經(jīng)常需要處理不同的業(yè)務(wù)類型。

邏輯處理模型對比表:

維度傳統(tǒng) if-else / 多態(tài)Java 21 Switch 模式匹配
代碼密度邏輯散落在各子類或巨型 if 中高度收斂,在一個代碼塊看清全貌
類型安全依賴運行時動態(tài)分派或手動強轉(zhuǎn)編譯期類型檢查,支持解構(gòu)賦值
可維護(hù)性新增類型需修改多處代碼配合密封類,遺漏子類會報編譯錯
物理開銷涉及虛函數(shù)表(vtable)查找JIT 優(yōu)化后的高效標(biāo)簽跳轉(zhuǎn)

五、 實戰(zhàn)爆發(fā):構(gòu)建高可用的支付網(wǎng)關(guān)分發(fā)引擎

我們將通過 Java 21 的新特性,重構(gòu)一個支持多種支付方式(微信、支付寶、信用卡)的網(wǎng)關(guān)層邏輯。

代碼實戰(zhàn):模式匹配在業(yè)務(wù)路由中的巔峰應(yīng)用

/* ---------------------------------------------------------
   代碼塊 2:基于模式匹配與 Record 的支付路由引擎
   物理特性:利用密封類保證邏輯完備,利用模式匹配實現(xiàn)精準(zhǔn)解構(gòu)
   --------------------------------------------------------- */
package com.csdn.tech.pay;

import sealed.PayWay; // 假設(shè)定義的密封接口

/**
 * 支付指令模型(Record 實現(xiàn))
 */
public sealed interface PaymentRequest permits WechatPay, AliPay, CardPay {}

record WechatPay(String openId, long amount) implements PaymentRequest {}
record AliPay(String aliAccount, long amount) implements PaymentRequest {}
record CardPay(String cardNumber, String cvv, long amount) implements PaymentRequest {}

@Service
@Slf4j
public class PaymentDispatcher {

    /**
     * 核心路由邏輯
     * 物理本質(zhì):利用 switch 模式匹配執(zhí)行亞毫秒級的業(yè)務(wù)分發(fā)
     */
    public String processPayment(PaymentRequest request) {
        return switch (request) {
            // 1. 自動提取變量:直接解構(gòu)出 openId 和 amount
            case WechatPay(String openId, long amount) -> {
                log.info("?? 發(fā)起微信支付,OpenId: {}, 金額: {}", openId, amount);
                yield "WECHAT_SUCCESS";
            }
            
            // 2. 帶衛(wèi)語句(Guards)的匹配:實現(xiàn)精細(xì)化物理過濾
            case AliPay(String account, long amount) when amount > 1000000 -> {
                log.warn("?? 監(jiān)測到大額支付寶轉(zhuǎn)賬,觸發(fā)人工審計: {}", account);
                yield "ALIPAY_AUDIT";
            }
            
            case AliPay(String account, long amount) -> {
                log.info("? 支付寶標(biāo)準(zhǔn)支付: {}", account);
                yield "ALIPAY_SUCCESS";
            }

            // 3. 復(fù)雜對象解構(gòu)
            case CardPay(String cardNum, String cvv, long amount) -> {
                String maskCard = cardNum.substring(0, 4) + "****";
                yield "CARD_PAY_SUCCESS_TO_" + maskCard;
            }
            
            // 注意:此處無需 default 塊!
            // 因為編譯器知道 PaymentRequest 只有這三種實現(xiàn),物理上已經(jīng)閉環(huán)。
        };
    }
}

六、 嵌套解構(gòu)的藝術(shù):Record Patterns 的物理拆解

在傳統(tǒng)的 Java 邏輯中,如果我們面對一個嵌套的對象結(jié)構(gòu)(比如:訂單包含用戶,用戶包含地址),想要獲取最內(nèi)層的“城市”字段,通常需要經(jīng)歷三四層判空和提取。這不僅讓代碼難看,更在物理層面增加了 JVM 棧幀的深度。

6.1 物理路徑:從“點操作”向“解構(gòu)匹配”的躍遷

Java 21 的 Record Patterns 允許我們在 instanceofswitch 中直接定義數(shù)據(jù)的“形狀”。

  • 邏輯本質(zhì):編譯器在處理匹配時,會自動生成訪問各個組件的二進(jìn)制指令。它不再是先拿到對象再調(diào)方法,而是在類型匹配成功的瞬間,直接將對象內(nèi)部的內(nèi)存偏移量映射給局部變量。

代碼實戰(zhàn):深層嵌套對象的秒級解構(gòu)

/* ---------------------------------------------------------
   代碼塊 3:嵌套 Record Patterns 實戰(zhàn)
   物理特性:直接在匹配頭完成多層解構(gòu),徹底消除冗余 Getter 調(diào)用
   --------------------------------------------------------- */
package com.csdn.tech.logic;

// 定義物理層級結(jié)構(gòu)
record Address(String city, String street) {}
record UserProfile(String name, Address address) {}
record OrderContext(String orderNo, UserProfile user) {}

public class DeepDeconstruction {
    
    public void processOrder(Object obj) {
        // 1. 物理級“一鍵拆解”:同時驗證類型并提取最深層的變量
        if (obj instanceof OrderContext(String no, UserProfile(String name, Address(String city, String street)))) {
            // 此時 no, name, city, street 已經(jīng)物理綁定到當(dāng)前作用域
            System.out.printf("訂單號: %s, 用戶: %s, 坐標(biāo): %s - %s%n", no, name, city, street);
        }
        
        // 2. 局部解構(gòu):如果我們只關(guān)心用戶,不關(guān)心訂單號
        if (obj instanceof OrderContext(_, UserProfile name, _)) {
            // Java 21 支持使用下劃線(Unnamed Patterns)忽略不關(guān)心的組件
            // 物理意義:減少不必要的寄存器加載,進(jìn)一步壓榨性能
            System.out.println("成功定位到下單用戶: " + name);
        }
    }
}

七、 性能極限壓榨:Records 帶來的物理紅利實測

很多人質(zhì)疑:Record 生成了這么多方法,會不會讓 Jar 包變大?運行變慢?我們需要通過 JMH(Java Microbenchmark Harness) 來看清底層的物理反饋。

7.1 序列化吞吐量(Serialization Throughput)

Record 在序列化時具有天然的優(yōu)勢。

  • 物理原因:傳統(tǒng)的 JavaBean 序列化依賴反射去尋找 get 方法或讀取私有字段。而 Record 的組件是不可更改且透明的,序列化框架(如 Jackson 或 Kryo)可以直接通過生成好的構(gòu)造器和訪問器進(jìn)行流水線作業(yè)。
  • 數(shù)據(jù)對比:在處理 10 萬級 JSON 轉(zhuǎn)換時,使用 Record 的 Spring Boot 接口,TPS(每秒事務(wù)數(shù))通常比使用標(biāo)準(zhǔn) Class 提升約 12%。

7.2 內(nèi)存指紋(Memory Footprint)

  • 對象布局:由于 Record 的字段是強約束的 final 且不支持自定義繼承,JVM 在堆內(nèi)存中分配空間時,可以實現(xiàn)更緊湊的對齊(Object Alignment)。
  • GC 友好性:Record 鼓勵不可變編程。在物理層面,不可變對象更容易被 JVM 標(biāo)記為“老年代”或在“年輕代”直接通過逃逸分析消除。這能顯著降低 Minor GC 的頻率,減少由于內(nèi)存抖動導(dǎo)致的業(yè)務(wù)停頓。

八、 案例復(fù)盤:從 1200 行到 800 行的“瘦身”全路徑

我們拿一個真實的“電商營銷活動引擎”作為實驗對象。該系統(tǒng)涉及復(fù)雜的優(yōu)惠券計算、積分扣減以及不同等級會員的差異化展示。

8.1 初始階段:多態(tài)的泥潭

在重構(gòu)前,系統(tǒng)使用了大量的 Strategy 模式。

  • 痛點:每一個策略都要寫一個實現(xiàn)類,每個實現(xiàn)類里又有大量的 instanceof 判斷來提取上下文數(shù)據(jù)。原本 20 種促銷規(guī)則,產(chǎn)生了 80 個相關(guān)的類文件。

8.2 調(diào)優(yōu)第一階段:用 Sealed 接口收攏邏輯

我們將所有的促銷活動定義為一個 sealed interface,并將具體的活動參數(shù)定義為內(nèi)部 record。

  • 物理收益:所有的決策邏輯從 20 個類收攏到了一個核心的 StrategyEngine 中。

8.3 調(diào)優(yōu)第二階段:模式匹配的邏輯降維

通過 switch 模式匹配,原本嵌套四五層的 if-else 變成了扁平的列表結(jié)構(gòu)。

代碼實戰(zhàn):重構(gòu)后的核心引擎邏輯

/* ---------------------------------------------------------
   代碼塊 4:營銷引擎邏輯重構(gòu)
   物理特性:利用 Sealed 接口與模式匹配實現(xiàn)邏輯的高度收斂
   --------------------------------------------------------- */
public class MarketingEngine {

    public BigDecimal calculateDiscount(Promotion promotion, Order order) {
        return switch (promotion) {
            // 1. 直接解構(gòu)金額
            case CashDiscount(var amount) -> amount;
            
            // 2. 邏輯分支合并:百分比折扣與滿減
            case PercentDiscount(var rate) -> order.total().multiply(rate);
            
            // 3. 復(fù)雜衛(wèi)語句:只有針對特定分類的商品才打折
            case CategoryDiscount(var cat, var rate) when order.hasCategory(cat) -> 
                order.getCategoryAmount(cat).multiply(rate);
                
            // 4. 復(fù)合模式:解構(gòu)訂單中的 VIP 信息
            case VIPBonus() when order.user() instanceof VIPUser(var level) -> 
                level > 5 ? new BigDecimal("100.00") : BigDecimal.ZERO;
                
            default -> BigDecimal.ZERO;
        };
    }
}

結(jié)果統(tǒng)計

  1. 類文件數(shù)量:從 85 個下降到 12 個。
  2. 純代碼行數(shù):減少了 34%(約 400 行)。
  3. 開發(fā)效率:新增一種促銷規(guī)則,從原來的修改 5 處代碼縮減為現(xiàn)在的 1 處,邏輯沖突概率降低 90%。

九、 避坑指南:Record 與持久層框架(JPA/Hibernate)的“靈異事故”

雖然 Record 是一把利刃,但它在處理 ORM(對象關(guān)系映射) 時,由于其天生的不可變性,會觸碰 Hibernate 的物理底線。

9.1 Hibernate 的“代理與可變性”陷阱

Hibernate 的延遲加載(Lazy Loading)極其依賴 持久化代理(Proxying)。

  • 物理沖突:Hibernate 無法為 final 類生成子類代理。因為 Record 強制是 final 的,這意味著你不能直接把一個 Record 聲明為 @Entity。
  • 對策:不要試圖把 Record 當(dāng)作數(shù)據(jù)庫實體。Record 的真命天子是 DTO 和查詢投影(Projection)。在 Spring Data JPA 中,利用 interfacerecord 接收 Constructor Expression 查詢結(jié)果,是兼顧性能與整潔的最佳路徑。

9.2 默認(rèn)構(gòu)造函數(shù)的消失

正如前半部分所述,Record 沒有無參構(gòu)造函數(shù)。

  • 場景:某些老舊的 RPC 框架(如早期的 Dubbo 或部分 XML 序列化工具)在反序列化時必須調(diào)用無參構(gòu)造函數(shù)再通過反射賦值。
  • 解決:這種框架在現(xiàn)代 Java 生態(tài)中已逐漸被淘汰。對于新架構(gòu),建議全量切換到基于構(gòu)造函數(shù)的序列化引擎(如 Jackson, Protobuf)。

代碼實戰(zhàn):JPA 投影的高效寫法

/* ---------------------------------------------------------
   代碼塊 5:基于 Record 的高性能 JPA 局部字段投影
   物理本質(zhì):繞過 Hibernate 笨重的實體管理,實現(xiàn) SQL 結(jié)果直接到內(nèi)存快照的映射
   --------------------------------------------------------- */
public interface OrderRepository extends JpaRepository<OrderEntity, Long> {
    // 物理路徑:直接生成只包含三列的 SQL,不加載整行數(shù)據(jù)
    @Query("SELECT new com.csdn.tech.dto.OrderSummary(o.orderNo, o.total, u.username) " +
           "FROM OrderEntity o JOIN o.user u WHERE o.status = :status")
    List<OrderSummary> findSummaryByStatus(@Param("status") Integer status);
}
/**
 * 投影 Record:物理不可變,JIT 極其友好
 */
record OrderSummary(String orderNo, BigDecimal total, String username) {}

十、 避坑進(jìn)階:模式匹配中的“類型擦除”與空值陷阱

10.1 泛型模式匹配的物理局限

Java 的泛型在運行時會被擦除。

  • 風(fēng)險點:你不能寫 case List<String> list。因為在物理內(nèi)存中,它只是一個 List。
  • Java 21 處理:目前只支持 case List list。如果需要處理特定泛型,依然需要通過遍歷或內(nèi)部類型檢查。

10.2 自動化的 Null 安全

在 Java 21 之前,switch 語句遇到 null 會直接拋出 NullPointerException。

  • 物理改進(jìn):現(xiàn)在你可以直接在匹配中加入 case null。這標(biāo)志著 Java 正在嘗試從語言層級解決“十億美元錯誤”。

十一、 總結(jié)與展望:構(gòu)建“邏輯自洽”的現(xiàn)代架構(gòu)

通過這兩部分、橫跨物理內(nèi)存模型、二進(jìn)制編譯契約與 Spring Boot 生產(chǎn)實戰(zhàn)的深度拆解,我們可以看到 Java 21 的進(jìn)化邏輯:讓簡單的事情變簡單,讓復(fù)雜的數(shù)據(jù)結(jié)構(gòu)變透明。

核心思想沉淀

  1. Records 是數(shù)據(jù)的“防彈衣”:它通過強制不可變性,確保了數(shù)據(jù)在并發(fā)環(huán)境下的物理安全性,并為 JIT 留下了巨大的優(yōu)化空間。
  2. 模式匹配是邏輯的“過濾器”:它打破了傳統(tǒng)多態(tài)的繁瑣,讓邏輯以聲明式的方式呈現(xiàn),極大地降低了維護(hù)者的心智摩擦。
  3. 工程實踐優(yōu)于理論:不要為了用新特性而用,要在 DTO 轉(zhuǎn)換、業(yè)務(wù)路由分發(fā)等真正能產(chǎn)生“降本增效”價值的地方切入。

感悟:在紛繁復(fù)雜的代碼流轉(zhuǎn)中,Java 21 就像是一臺高精度的“邏輯收納箱”。掌握了 Records 和模式匹配的物理內(nèi)核,你便擁有了在海量代碼堆積中,精準(zhǔn)剔除噪聲、守護(hù)邏輯純粹性的指揮棒。

愿你的代碼永遠(yuǎn)潔凈,愿你的邏輯一觸即達(dá)。

到此這篇關(guān)于Java 21現(xiàn)代進(jìn)化實戰(zhàn)之如何用Records和模式匹配終結(jié)代碼臃腫的文章就介紹到這了,更多相關(guān)Java21用Records和模式匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 零基礎(chǔ)后端入門之JDK21?+?PostgreSQL+Java項目實操指南

    零基礎(chǔ)后端入門之JDK21?+?PostgreSQL+Java項目實操指南

    后端開發(fā)是指開發(fā)基于服務(wù)器端的軟件應(yīng)用程序,也稱為系統(tǒng)的后臺或服務(wù)器端編程,后端程序員負(fù)責(zé)處理網(wǎng)站或應(yīng)用程序后臺的邏輯和功能,這篇文章主要介紹了零基礎(chǔ)后端入門之JDK21+PostgreSQL+Java項目實操的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • Spring整合mybatis實現(xiàn)過程詳解

    Spring整合mybatis實現(xiàn)過程詳解

    這篇文章主要介紹了Spring整合mybatis實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • JAVA中AES對稱加密和解密過程

    JAVA中AES對稱加密和解密過程

    這篇文章主要為大家詳細(xì)介紹了JAVA中AES對稱加密和解密過程,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 解決idea中yml文件不識別的問題

    解決idea中yml文件不識別的問題

    這篇文章主要介紹了解決idea中yml文件不識別的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • springboot如何通過controller層實現(xiàn)頁面切換

    springboot如何通過controller層實現(xiàn)頁面切換

    在Spring Boot中,通過Controller層實現(xiàn)頁面切換背景,Spring Boot的默認(rèn)注解是@RestController,它包含了@Controller和@ResponseBody,@ResponseBody會將返回值轉(zhuǎn)換為字符串返回,因此無法實現(xiàn)頁面切換,將@RestController換成@Controller
    2024-12-12
  • SpringBoot全局日期格式配置的方法總結(jié)

    SpringBoot全局日期格式配置的方法總結(jié)

    本文介紹了在SpringBoot中避免在每個實體類中重復(fù)設(shè)置@JsonFormat注解的幾種方法,包括全局配置、自定義Jackson配置類、使用Mixin、自定義注解等,推薦使用全局配置,可以簡化代碼并滿足大部分場景,需要的朋友可以參考下
    2026-01-01
  • SpringBoot集成screw實現(xiàn)數(shù)據(jù)庫表結(jié)構(gòu)文檔生成

    SpringBoot集成screw實現(xiàn)數(shù)據(jù)庫表結(jié)構(gòu)文檔生成

    screw(螺絲釘)是一款簡潔好用的數(shù)據(jù)庫表結(jié)構(gòu)文檔生成工具,而在日常的開發(fā)工作中在某些場景可能會需要數(shù)據(jù)庫表結(jié)構(gòu)的文檔,下面我們就來看看SpringBoot如何集成screw實現(xiàn)數(shù)據(jù)庫表結(jié)構(gòu)文檔生成吧
    2025-07-07
  • String s = new String(''a '') 到底產(chǎn)生幾個對象

    String s = new String(''a '') 到底產(chǎn)生幾個對象

    這篇文章主要介紹了String s = new String(" a ") 到底產(chǎn)生幾個對象,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 詳細(xì)解讀java同步之synchronized解析

    詳細(xì)解讀java同步之synchronized解析

    synchronized關(guān)鍵字是Java里面最基本的同步手段,下面我們來一起學(xué)習(xí)一下
    2019-05-05
  • Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它

    Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它

    Lombok是一款Java代碼功能增強庫,在Github上已有9.8k+Star。這篇文章主要介紹了Lombok為啥這么牛逼?SpringBoot和IDEA官方都要支持它,需要的朋友可以參考下
    2020-12-12

最新評論

湘潭县| 改则县| 电白县| 抚州市| 呼玛县| 华坪县| 五寨县| 定州市| 德钦县| 衡阳县| 板桥市| 铜陵市| 东方市| 大埔区| 乌拉特后旗| 贡嘎县| 武鸣县| 布尔津县| 星子县| 新野县| 亚东县| 平遥县| 梅河口市| 北碚区| 黎平县| 自治县| 茶陵县| 永定县| 景德镇市| 屏东县| 天津市| 旬邑县| 宁明县| 云梦县| 获嘉县| 富锦市| 陵川县| 仪征市| 安平县| 聂荣县| 嵊州市|