lombok是怎麼用的

ivanlee717發表於2024-11-28

lombok

Lombok是一個Java庫,能自動插入編輯器並構建工具,簡化Java開發。透過新增註解的方式,不需要為類編寫getter或equals方法,同時可以自動化日誌變數。用大白話來講,Lombok可以透過幾個註釋在編譯的時候為我們的JavaBean動態的生成get,set,tostring,無參構造方法,全引數構造方法,基於builder的建立方式。image-20241128091018603

在[上一節](用一個專案把控制層、業務層、持久層說明白了,每一句話都講的很清楚 - ivanlee717 - 部落格園)在我們定義一個實體類的時候,會用快捷方法生成了很多方法,但是這種程式碼我們可以直接透過幾個簡單的註解完成。

lombok安裝

<!--Lombok引入-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

image-20241128093002481

lombok原理

Lombok的基本實現原理可以概括為以下幾個步驟:

  1. 註解掃描:Lombok的註解處理器會掃描Java原始碼中的註解,並找到使用了Lombok註解的類、欄位和方法。
  2. AST操作:Lombok註解處理器會對註解所標註的類進行抽象語法樹(AST)的解析和操作,以識別和處理這些註解。
  3. 註解解析:註解處理器解析找到的註解,確定需要生成的程式碼型別和內容。
  4. 程式碼生成:基於註解的定義和規則,Lombok註解處理器生成相應的程式碼片段,如getter和setter方法、建構函式等。
  5. 程式碼注入:生成的程式碼片段被插入到編譯結果中的相應位置,與手動編寫的程式碼合併在一起。
  6. 最終編譯:編譯器將生成的程式碼和手動編寫的程式碼一起編譯為最終的位元組碼檔案。

image-20241128093547668

普通的java程式執行原理如上圖所示,但是lombok會作為一個外掛幫助使用者程式碼更簡潔image-20241128100123009

lombok註解

註解 註解作用
@Getter 自動生成getter方法
@Setter 自動生成Setter方法
@ToString 自動生成tostring方法
@EqualsAndHashCode 自動生成equals和hashCode方法
@NoArgsConstructor 自動生成無參建構函式
@AllArgsConstructor 自動生成包含所有欄位的建構函式

常用的組合註解有

註解 註解作用
@Data 組合了@Getter、@Setter、@ToString、@EqualsAndHashCode等註解的功能
@Value 組合了@Getter、@ToString、@EqualsAndHashCode等註解的功能

@Data註解和@Value註解有哪些區別?

@Data生成的類是可變的,具有可讀寫的setter方法,@Value生成的類是不可變的,欄位是final的,沒有生成setter方法。

Lombok日誌註解:

註解 註解作用
@Slf4j 自動生成一個名為log的日誌記錄器

其他註解用的不多,先提一下

註解 註解作用
@Builder 自動生成Builder模式的構造器方法
@NonNull 自動生成非空檢查
@Delegate 自動生成委託方法
@Cleanup 自動釋放資源

程式碼實現

image-20241128114053957

直接設定這三個註解就幫助我們搞定了很多冗餘的程式碼,現在寫一個測試方法

@Test
public void lombok(){
    User user = new User();
    user.setUsername("test");
    user.setPassword("1234");
    user.setGender(1);
    user.setCreateUser(user.getUsername());
    user.setModifiedUser(user.getUsername());
    Date date = new Date();
    user.setCreateTime(date);
    user.setModifiedTime(date);
    System.out.println(user.toString());
}

image-20241128114629401

上述過程也可以直接使用@Data解決。

如果在定義實體的時候使用@builder,可以在宣告一個例項的時候運用以下寫法

User user = User.builder()
                .uid(1)
                .username("1234")
                .password("5678")
                .gender(0)
                .email("kxcnsakdn").build();
System.out.println(user.toString());

image-20241128171154147

相關文章