1.Lombok簡介
官方介紹java
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
大概的意思:Lombok是一個Java庫,能自動插入編輯器並構建工具,簡化Java開發。經過添加註解的方式,不須要爲類編寫getter或eques方法,同時能夠自動化日誌變量。spring
簡而言之:Lombok能以簡單的註解形式來簡化java代碼,提升開發人員的開發效率。
api
2.Lombok使用
使用Lombok須要的開發環境Java+Maven+IntelliJ IDEA或者Eclipse(安裝Lombok Plugin)springboot
2.1添加maven依賴app
springboot官網生成的依賴eclipse
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
通常工程依賴maven
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> <scope>provided</scope> </dependency>
2.2安裝插件
使用Lombok還須要插件的配合,我使用開發工具爲idea,這裏只講解idea中安裝lombok插件,使用eclipse和myeclipse的小夥伴和自行google安裝方法。
打開idea的設置,點擊Plugins,點擊Browse repositories,在彈出的窗口中搜索lombok,而後安裝便可。編輯器
2.3解決編譯時出錯問題
編譯時出錯,多是沒有enable註解處理器。Annotation Processors > Enable annotation processing。設置完成以後程序正常運行。ide
2.4示例
下面舉兩個栗子,看看使用lombok和不使用的區別。工具
建立一個用戶類
不使用Lombok
public class User implements Serializable { private static final long serialVersionUID = -8054600833969507380L; private Integer id; private String username; private Integer age; public User() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(username, user.username) && Objects.equals(age, user.age); } @Override public int hashCode() { return Objects.hash(id, username, age); } }
使用Lombok
@Data public class User implements Serializable { private static final long serialVersionUID = -8054600833969507380L; private Integer id; private String username; private Integer age; }
編譯源文件,而後反編譯class文件,反編譯結果以下圖。說明@Data註解在類上,會爲類的全部屬性自動生成setter/getter、equals、canEqual、hashCode、toString方法,如爲final屬性,則不會爲該屬性生成setter方法。
自動化日誌變量
@Slf4j @RestController @RequestMapping(("/user")) public class UserController { @GetMapping("/getUserById/{id}") public User getUserById(@PathVariable Integer id) { User user = new User(); user.setUsername("風清揚"); user.setAge(21); user.setId(id); if (log.isInfoEnabled()) { log.info("用戶 {}", user); } return user; } }
經過反編譯能夠看到@Slf4j註解生成了log日誌變量(嚴格意義來講是常量),無需去聲明一個log就能夠在類中使用log記錄日誌。
2.5經常使用註解
下面介紹一下經常使用的幾個註解:
@Setter 註解在類或字段,註解在類時爲全部字段生成setter方法,註解在字段上時只爲該字段生成setter方法。 @Getter 使用方法同上,區別在於生成的是getter方法。 @ToString 註解在類,添加toString方法。 @EqualsAndHashCode 註解在類,生成hashCode和equals方法。 @NoArgsConstructor 註解在類,生成無參的構造方法。 @RequiredArgsConstructor 註解在類,爲類中須要特殊處理的字段生成構造方法,好比final和被@NonNull註解的字段。 @AllArgsConstructor 註解在類,生成包含類中全部字段的構造方法。 @Data 註解在類,生成setter/getter、equals、canEqual、hashCode、toString方法,如爲final屬性,則不會爲該屬性生成setter方法。 @Slf4j 註解在類,生成log變量,嚴格意義來講是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);
3.Lombok工做原理
在Lombok使用的過程當中,只須要添加相應的註解,無需再爲此寫任何代碼。自動生成的代碼究竟是如何產生的呢?
核心之處就是對於註解的解析上。JDK5引入了註解的同時,也提供了兩種解析方式。
運行時解析
運行時可以解析的註解,必須將@Retention設置爲RUNTIME,這樣就能夠經過反射拿到該註解。java.lang.reflect反射包中提供了一個接口AnnotatedElement,該接口定義了獲取註解信息的幾個方法,Class、Constructor、Field、Method、Package等都實現了該接口,對反射熟悉的朋友應該都會很熟悉這種解析方式。
編譯時解析
編譯時解析有兩種機制,分別簡單描述下:
1)Annotation Processing Tool
apt自JDK5產生,JDK7已標記爲過時,不推薦使用,JDK8中已完全刪除,自JDK6開始,可使用Pluggable Annotation Processing API來替換它,apt被替換主要有2點緣由:
api都在com.sun.mirror非標準包下
沒有集成到javac中,須要額外運行
2)Pluggable Annotation Processing API
JSR 269自JDK6加入,做爲apt的替代方案,它解決了apt的兩個問題,javac在執行的時候會調用實現了該API的程序,這樣咱們就能夠對編譯器作一些加強,javac執行的過程以下:
Lombok本質上就是一個實現了「JSR 269 API」的程序。在使用javac的過程當中,它產生做用的具體流程以下:
javac對源代碼進行分析,生成了一棵抽象語法樹(AST)
運行過程當中調用實現了「JSR 269 API」的Lombok程序
此時Lombok就對第一步驟獲得的AST進行處理,找到@Data註解所在類對應的語法樹(AST),而後修改該語法樹(AST),增長getter和setter方法定義的相應樹節點
javac使用修改後的抽象語法樹(AST)生成字節碼文件,即給class增長新的節點(代碼塊)
經過讀Lombok源碼,發現對應註解的實現都在HandleXXX中,好比@Getter註解的實如今HandleGetter.handle()。還有一些其它類庫使用這種方式實現,好比Google Auto、Dagger等等。
4.Lombok的優缺點
優勢:
能經過註解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提升了必定的開發效率
讓代碼變得簡潔,不用過多的去關注相應的方法
屬性作修改時,也簡化了維護爲這些屬性所生成的getter/setter方法等
缺點:
不支持多種參數構造器的重載雖然省去了手動建立getter/setter方法的麻煩,但大大下降了源代碼的可讀性和完整性,下降了閱讀源代碼的溫馨度————————————————版權聲明:本文爲CSDN博主「ThinkWon」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/ThinkWon/article/details/101392808