最近做一個項目,發現實體類中僅僅隻是定義了變量,沒有任何setter,getter,方法,也沒有構造函數,但是卻可以正常的調用,仔細檢視後發現類上比之前所見的類多了一些注解,@Date,@EqualsAndHashCode.經過多方查找,終于大概弄明白了,現在寫出來一方面鞏固自己所學,順便供大家參考,有說的不好的地方,歡迎大家指出,共同進步...
一、Lombok是什麼
現在看一下Lombok官方對其進行的解釋:Lombok官網:https://projectlombok.org
Lombok項目是一種自動接通你的編輯器和建構工具的一個Java庫。不用再一次寫額外的getter或者equals方法。由此可以看出,lombok會幫我們自動生成getter和euqals方法,但是更有意思的是,當我們的變量發生改變時,我們不再需要修改對的getter、setter方法,lombok幫我們在運作的過程中自動生成上述方法,編碼更靈活.
是以,使用lombok的優點: 1、簡化long備援的javabean代碼;
2、提高執行效率
二、如何使用Lombok
1、引入依賴:(版本自行選擇)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
有些情況下引入依賴還是不能使用(不能調用getter、setter),此時可以通過安裝插件解決:

三、lombok中的常用注解
- @Setter :在JavaBean或類JavaBean中使用,使用此注解會生成對應的setter方法;
- @Getter:在JavaBean或類JavaBean中使用,使用此注解會生成對應的getter方法;
- @ToString:在JavaBean或類JavaBean中使用,使用此注解會自動重寫對應的toStirng方法;
- @NoArgsConstructor:在JavaBean或類JavaBean中使用,使用此注解會生成對應的無參構造方法;
- @HashCode:
- @Equals:
- @CanEqual:
- @Data:在JavaBean或類JavaBean中使用,這個注解包含範圍最廣,它包含上述注解,即當使用目前注解時,會自動生成包含的所有方法;
- @AllArgsConstructor:在JavaBean或類JavaBean中使用,使用此注解會生成對應的有參構造方法;
- @Log(這是一個泛型注解,具體有很多種形式)
- @EqualsAndHashCode:在JavaBean或類JavaBean中使用,使用此注解會自動重寫對應的equals方法和hashCode方法;
1. 此注解會生成
equals(Object other)
和
hashCode()
方法。
2. 它預設使用非靜态,非瞬态的屬性
3. 可通過參數
exclude
排除一些屬性
4. 可通過參數
of
指定僅使用哪些屬性
5. 它預設僅使用該類中定義的屬性且不調用父類的方法
6. 可通過
callSuper=true
解決上一點問題。讓其生成的方法中調用父類的方法。
- @Slf4j:在需要列印日志的類中使用,當項目中使用了slf4j列印日志架構時使用該注解,會簡化日志的列印流程,隻需調用info方法即可;
- @Log4j:在需要列印日志的類中使用,當項目中使用了log4j列印日志架構時使用該注解,會簡化日志的列印流程,隻需調用info方法即可;
在使用以上注解需要處理參數時,處理方法如下(以@ToString注解為例,其他注解同@ToString注解):
@ToString(exclude="column")
意義:排除column列所對應的元素,即在生成toString方法時不包含column參數;
@ToString(exclude={"column1","column2"})
意義:排除多個column列所對應的元素,其中間用英文狀态下的逗号進行分割,即在生成toString方法時不包含多個column參數;
@ToString(of="column")
意義:隻生成包含column列所對應的元素的參數的toString方法,即在生成toString方法時隻包含column參數;;
@ToString(of={"column1","column2"})
意義:隻生成包含多個column列所對應的元素的參數的toString方法,其中間用英文狀态下的逗号進行分割,即在生成toString方法時隻包含多個column參數;
@Date一般和@EqualsAndHashCode同時使用,因為:
通過官方文檔,可以得知,當使用@Data注解時,則有了@EqualsAndHashCode注解,那麼就會在此類中存在equals(Object other) 和 hashCode()方法,且不會使用父類的屬性,這就導緻了可能的問題。
比如,有多個類有相同的部分屬性,把它們定義到父類中,恰好id(資料庫主鍵)也在父類中,那麼就會存在部分對象在比較時,它們并不相等,卻因為lombok自動生成的equals(Object other) 和 hashCode()方法判定為相等,進而導緻出錯。
修複此問題的方法很簡單:
1. 使用@Getter @Setter @ToString代替@Data并且自定義equals(Object other) 和 hashCode()方法,比如有些類隻需要判斷主鍵id是否相等即足矣。
2. 或者使用在使用@Data時同時加上@EqualsAndHashCode(callSuper=true)注解。