Like Share Discussion Bookmark Smile

J.J. Huang   2019-03-22   Spring Boot   瀏覽次數:

SpringBoot - 第十二章 | Lombok簡單介紹使用

在開發過程中,通常都會定義大量的JavaBean,然後通過IDE去產生其屬性的構造器、getter、setter、equals、hashcode、toString方法,當要增加屬性或者對某個屬性進行改變時,比如命名、類型等,都需要重新去產生上面提到的這些方法。這樣重複的勞動沒有任何意義,Lombok裡面的註解可以輕鬆解決這些問題。

Lombok介紹

Project Lombok是一個java庫,可以自動插入編輯器並構建工具,為你的java增添色彩。
永遠不要再寫另一個getter或equals方法,使用一個註釋,你的類具有一個功能齊全的構建器,自動化你的日誌記錄變量等等。

lombok實現的原理:主要是通過抽象語法樹(AST),在編譯處理後,對應到有其註解的類,那麼註解編譯器就會自動去對應項目中的註解對應到在lombok語法樹中的註解文件,並經過自動編譯對應來產生對應類中的getter或者setter方法,達到簡化代碼的目的

Mac Eclipse安裝Lombok

  • 下載 lombok.jar

  • 將 lombok.jar 放置與 eclipse.ini 同級的目錄

  • 編輯eclipse.ini,在最後加上 (注意路徑正確性)
1
-javaagent:/Applications/Eclipse.app/Contents/Eclipse/lombok.jar
  • 重新啟動Eclipse,並確認是否成功安裝

網路上很有針對其他系統的Eclipse安裝Lombok的文章,這邊就不再額外提供教學


Lombok的簡單使用

Lombok需要引入下面依賴

1
2
3
4
5
6
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>

Lombok常用的註解介紹

註解 說明
Val 可以將變量申明是final類型
@NonNull 註解能夠為方法或構造函數的參數提供非空檢查
@Cleanup 註解能夠自動釋放資源
@Getter/@Setter 註解可以針對類的屬性字段自動產生Get/Set方法
@ToString 註解,為使用該註解的類產生一個toString方法,默認的toString格式為:ClassName(fieldName= fieleValue ,fieldName1=fieleValue)
@EqualsAndHashCode 註解,為使用該註解的類自動產生equals和hashCode方法
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor 這幾個註解分別為類自動產生了無參構造器、指定參數的構造器和包含所有參數的構造器
@Data 註解作用比較全,其包含註解的集合@ToString,@EqualsAndHashCode,所有字段的@Getter和所有非final字段的@Setter, @RequiredArgsConstructor
@Builder 註解提供了一種比較推崇的構建值對象的方式
@Synchronized 註解類似Java中的Synchronized 關鍵字,但是可以隱藏同步鎖
@Log 註解適用於你使用的日誌系統; 然後,你有一個靜態的final log字段,初始化為你的類的名稱,然後你可以使用它來編寫日誌語句

Lombok基本使用範例

基本上官方網站已經提供了相當多的範例代碼,這邊僅做簡單的使用範例。

  • 使用Lombok
  • 等同於
  • 撰寫CustomerController
1
2
3
4
5
ID:1
Name:J.J.Huang
Age:18
ToString:Customer(id=1, name=J.J.Huang, age=18)
HashCode:747381461

可見Customer裡面,我們並沒有去寫get/set的方法,但是使用Lombok後,因為他會自己去產生相對應的方法讓我們去使用


Lombok原理

提到 Lombok,我們就得去提到 JSR 269: Pluggable Annotation Processing API 。 JSR 269 之前我們也有註解這樣的神器,可是我們比如想要做什麼必須使用反射,反射的方法局限性較大。首先,它必須定義@Retention為RetentionPolicy.RUNTIME,只能在運行時通過反射來獲取註解值,使得運行時代碼效率降低。其次,如果想在編譯階段利用註解來進行一些檢查,對用戶的某些不合理代碼給出錯誤報告,反射的使用方法就無能為力了。而 JSR 269 之後我們可以在 Javac的編譯期利用註解做這些事情。

從上圖可知,Annotation Processing是在解析和產生之間的一個步驟

從上面的Lombok執行的流程圖中可以看出,在Javac解析成AST抽象語法樹之後,Lombok根據自己編寫的註解處理器,動態地修改AST,增加新的節點(即Lombok自定義註解所需要產生的代碼),最終通過分析產生JVM可執行的字節碼類文件。使用註釋處理自定義註解是在編譯階段進行修改,而JDK的反射技術是在運行時動態修改,兩者相比,反射雖然更加靈活一些但是帶來的性能損耗更加大