Lombok主要常用的注解有:@Data,@getter,@setter,@NoArgsConstructor,@AllArgsConstructor,@ToString,@EqualsAndHashCode,@Slf4j,@Log4j。我們一個一個來看:
@Data注解:在JavaBean或類JavaBean中使用,這個注解包含范圍最廣,它包含getter、setter、NoArgsConstructor、equals、canEqual、hashCode、toString 注解,即當使用當前注解時,會自動生成包含的所有方法;
@getter注解:在JavaBean或類JavaBean中使用,使用此注解會生成對應的getter方法;
@setter注解:在JavaBean或類JavaBean中使用,使用此注解會生成對應的setter方法;
@NoArgsConstructor注解:在JavaBean或類JavaBean中使用,使用此注解會生成對應的無參構造方法;
@AllArgsConstructor注解:在JavaBean或類JavaBean中使用,使用此注解會生成對應的有參構造方法;
@ToString注解:在JavaBean或類JavaBean中使用,使用此注解會自動重寫對應的toStirng方法;
@EqualsAndHashCode注解:在JavaBean或類JavaBean中使用,使用此注解會自動重寫對應的equals方法和hashCode方法;
@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參數;
--------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
val
:用在局部變量前面,相當於將變量聲明為final@NonNull
:給方法參數增加這個注解會自動在方法內對該參數進行是否為空的校驗,如果為空,則拋出NPE(NullPointerException)@Cleanup
:自動管理資源,用在局部變量之前,在當前變量范圍內即將執行完畢退出之前會自動清理資源,自動生成try-finally這樣的代碼來關閉流@Getter/@Setter
:用在屬性上,再也不用自己手寫setter和getter方法了,還可以指定訪問范圍@ToString
:用在類上,可以自動覆寫toString方法,當然還可以加其他參數,例如@ToString(exclude=”id”)排除id屬性,或者@ToString(callSuper=true, includeFieldNames=true)調用父類的toString方法,包含所有屬性@EqualsAndHashCode
:用在類上,自動生成equals方法和hashCode方法@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
:用在類上,自動生成無參構造和使用所有參數的構造函數以及把所有@NonNull屬性作為參數的構造函數,如果指定staticName = “of”參數,同時還會生成一個返回類對象的靜態工廠方法,比使用構造函數方便很多@Data
:注解在類上,相當於同時使用了@ToString
、@EqualsAndHashCode
、@Getter
、@Setter
和@RequiredArgsConstrutor
這些注解,對於POJO類
十分有用@Value
:用在類上,是@Data的不可變形式,相當於為屬性添加final聲明,只提供getter方法,而不提供setter方法@Builder
:用在類、構造器、方法上,為你提供復雜的builder APIs,讓你可以像如下方式一樣調用Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
更多說明參考Builder@SneakyThrows
:自動拋受檢異常,而無需顯式在方法上使用throws語句@Synchronized
:用在方法上,將方法聲明為同步的,並自動加鎖,而鎖對象是一個私有的屬性$lock
或$LOCK
,而java中的synchronized關鍵字鎖對象是this,鎖在this或者自己的類對象上存在副作用,就是你不能阻止非受控代碼去鎖this或者類對象,這可能會導致競爭條件或者其它線程錯誤@Getter(lazy=true)
:可以替代經典的Double Check Lock樣板代碼@Log
:根據不同的注解生成不同類型的log對象,但是實例名稱都是log,有六種可選實現類@CommonsLog
Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);@Log
Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());@Log4j
Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);@Log4j2
Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);@Slf4j
Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);@XSlf4j
Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);