Lombok實際上在我們項目的代碼里早就統一使用了,用起來很方便,這幾天在總結博客的Idea插件系列,今天總結一下Lombok。
一、Lombok是什么
Lombok能以簡單的注解形式來簡化java代碼,提高開發人員的開發效率。例如開發中經常需要寫的javabean,都需要花時間去添加相應的getter/setter,也許還要去寫構造器、equals等方法,而且需要維護,當屬性多時會出現大量的getter/setter方法,這些顯得很冗長也沒有太多技術含量,一旦修改屬性,就容易出現忘記修改對應方法的失誤。
Lombok能通過注解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString方法。出現的神奇就是在源碼中沒有getter和setter方法,但是在編譯生成的字節碼文件中有getter和setter方法。這樣就省去了手動重建這些代碼的麻煩,使代碼看起來更簡潔些。
二、Lombok優缺點
優點:
-
- 能通過注解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提高了一定的開發效率
- 讓代碼變得簡潔,不用過多的去關注相應的方法
- 屬性做修改時,也簡化了維護為這些屬性所生成的getter/setter方法等
缺點:
-
- 不支持多種參數構造器的重載
- 雖然省去了手動創建getter/setter方法的麻煩,但大大降低了源代碼的可讀性和完整性,降低了閱讀源代碼的舒適度
三、Lombok原理
Lombok實現了JSR 269 API規范,javac在Java6開始支持這一規范,只要程序實現了該API,就能在javac運行的時候得到調用,那么Lombok在編譯時使用的就是javac,具體流程如下:
首先是項目的源代碼文件,在經過編譯處理以后,lombok會使用自己的抽象語法樹去進行注解的匹配,如果在項目中的某一個類中使用了lombok中的注解,那么注解編譯器就會自動去匹配項目中的注解對應到在lombok語法樹中的注解文件,並經過自動編譯匹配來生成對應類中的getter或者setter方法,達到簡化代碼的目的。執行順序就如上圖的疊放順序。
四、Lombok常用注解
@Data注解:在JavaBean中使用,這個注解包含范圍最廣,它包含getter、setter、NoArgsConstructor注解,即當使用當前注解時,會自動生成包含的所有方法;
@builder注解:在JavaBean中使用,使用此注解可通過builder方式初始化對象
@getter注解:在JavaBean中使用,使用此注解會生成對應的getter方法;
@setter注解:在JavaBean中使用,使用此注解會生成對應的setter方法;
@NoArgsConstructor注解:在JJavaBean中使用,使用此注解會生成對應的無參構造方法;
@AllArgsConstructor注解:在JJavaBean中使用,使用此注解會生成對應的有參構造方法;
@ToString注解:在JJavaBean中使用,使用此注解會自動重寫對應的toStirng方法;
@EqualsAndHashCode注解:在JavaBean中使用,使用此注解會自動重寫對應的equals方法和hashCode方法;
@Slf4j:在需要打印日志的類中使用,當項目中使用了slf4j打印日志框架時使用該注解,會簡化日志的打印流程,只需調用info方法即可;
@Log4j:在需要打印日志的類中使用,當項目中使用了log4j打印日志框架時使用該注解,會簡化日志的打印流程,只需調用info方法即可;
五、Idea安裝Lombok插件
點擊File-- Settings--Plugins設置界面,安裝Lombok插件:
點擊File-- Settings--Build,Execution,Deployment設置界面,開啟 AnnocationProcessors,開啟該項是為了讓Lombok注解在編譯階段起到作用。
六、Lombok使用方法
pom.xml中引入lombok依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency>
代碼中推薦寫法
@Data @NoArgsConstructor @Builder(toBuilder = true) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class UserInfo { private String name; @Builder.Default private String email = ""; } //@Builder注解賦值新對象 UserInfo userInfo = UserInfo.builder() .name("zzl") .email("bgood@sina.com") .build(); //@Builder注解修改原對象的屬性值,要求實體上添加@Builder(toBuilder=true) userInfo = userInfo.toBuilder() .name("OK") .email("zgood@sina.com") .build();