Lombok有啥牛皮的?SpringBoot和IDEA官方都要支持它! 摘要 Lombok簡介 Lombok集成 Lombok使用 Lombok原理

摘要

最近IDEA 2020最後一個版本要發佈了,已經內置了Lombok插件,SpringBoot 2.1.x之後的版本也在Starter中內置了Lombok依賴。爲什麼他們都要支持Lombok呢?今天我來講講Lombok的使用,看看它有何神奇之處!

Lombok簡介

Lombok是一款Java代碼功能增強庫,在Github上已有9.8k+Star。它會自動集成到你的編輯器和構建工具中,從而使你的Java代碼更加生動有趣。通過Lombok的註解,你可以不用再寫getter、setter、equals等方法,Lombok將在編譯時爲你自動生成。

Lombok集成

首先我們需要在IDEA中安裝好Lombok插件,如果你使用的是最新版IDEA 2020.3,則Lombok插件已經內置,無需安裝。

之後在項目的pom.xml文件中添加Lombok依賴,SpringBoot 2.1.x版本後無需指定Lombok版本,SpringBoot在spring-boot-dependencies中已經內置。

Lombok使用

Lombok中有很多註解,這些註解使得我們可以更加方便的編寫Java代碼,下面介紹下這些註解的使用。

val

使用val註解可以取代任意類型作爲局部變量,這樣我們就不用寫複雜的ArrayList和Map.Entry類型了,具體例子如下。

當我們使用了val註解後,Lombok會從局部變量的初始化表達式推斷出具體類型,編譯後會生成如下代碼。

@NonNull

在方法上使用@NonNull註解可以做非空判斷,如果傳入空值的話會直接拋出NullPointerException。

編譯後會在構造器中添加非空判斷,具體代碼如下。

@Cleanup

當我們在Java中使用資源時,不可避免地需要在使用後關閉資源。使用@Cleanup註解可以自動關閉資源。

編譯後Lombok會生成如下代碼。

@Getter/@Setter

有了@Getter/@Setter註解,我們再也不用編寫getter/setter方法了。試想下之前即使我們使用IDEA自動生成getter/setter方法,如果類屬性的類型和名稱改了,又要重新生成getter/setter方法也是一件很麻煩的事情。

編譯後Lombok會生成如下代碼。

@ToString

把所有類屬性都編寫到toString方法中方便打印日誌,是一件多麼枯燥無味的事情。使用@ToString註解可以自動生成toString方法,默認會包含所有類屬性,使用@ToString.Exclude註解可以排除屬性的生成。

編譯後Lombok會生成如下代碼。

@EqualsAndHashCode

使用@EqualsAndHashCode註解可以自動生成hashCode和equals方法,默認包含所有類屬性,使用@EqualsAndHashCode.Exclude可以排除屬性的生成。

編譯後Lombok會生成如下代碼。

@XxConstructor

使用@XxConstructor註解可以自動生成構造方法,有@NoArgsConstructor、@RequiredArgsConstructor和@AllArgsConstructor三個註解可以使用。

@NoArgsConstructor:生成無參構造函數。

@RequiredArgsConstructor:生成包含必須參數的構造函數,使用@NonNull註解的類屬性爲必須參數。

@AllArgsConstructor:生成包含所有參數的構造函數。

編譯後Lombok會生成如下代碼。

@Data

@Data是一個方便使用的組合註解,是@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor的組合體。

編譯後Lombok會生成如下代碼。

@Value

使用@Value註解可以把類聲明爲不可變的,聲明後此類相當於final類,無法被繼承,其屬性也會變成final屬性。

編譯後Lombok會生成如下代碼。

@Builder

使用@Builder註解可以通過建造者模式來創建對象,建造者模式加鏈式調用,創建對象太方便了

編譯後Lombok會生成如下代碼。

@SneakyThrows

還在手動捕獲並拋出異常?使用@SneakyThrows註解自動實現試試!

編譯後Lombok會生成如下代碼。

@Synchronized

當我們在多個線程中訪問同一資源時,往往會出現線程安全問題,以前我們往往使用synchronized關鍵字修飾方法來實現同步訪問。使用@Synchronized註解同樣可以實現同步訪問。

編譯後Lombok會生成如下代碼。

@With

使用@With註解可以實現對原對象進行克隆,並改變其一個屬性,使用時需要指定全參構造方法。

編譯後Lombok會生成如下代碼。

@Getter(lazy=true)

當我們獲取某一個屬性比較消耗資源時,可以給@Getter添加lazy=true屬性實現懶加載,會生成Double Check Lock 樣板代碼對屬性進行懶加載。

編譯後Lombok會生成如下代碼。

@Log

使用@Log註解,可以直接生成日誌對象log,通過log對象可以直接打印日誌。

編譯後Lombok會生成如下代碼。

@Slf4j

使用Lombok生成日誌對象時,根據使用日誌實現的不同,有多種註解可以使用。比如@Log、@Log4j、@Log4j2、@Slf4j等。

編譯後Lombok會生成如下代碼。

Lombok原理

如果IDEA不安裝Lombok插件的話,我們打開使用Lombok的項目是無法通過編譯的。裝了以後IDEA纔會提示我們Lombok爲我們生成的方法和屬性。

使用了@Data註解以後,查看類結構可以發現getter、setter、toString等方法。

打開target目錄下的.class文件,我們可以看到Lombok爲我們生成的代碼,可見Lombok是通過解析註解,然後在編譯時生成代碼來實現Java代碼的功能增強的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章