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 | <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 | ID:1 |
可見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的反射技術是在運行時動態修改,兩者相比,反射雖然更加靈活一些但是帶來的性能損耗更加大