目錄java
https://zhuanlan.zhihu.com/p/32779910spring
lombok概念和基本使用,看這一篇就足夠了數據庫
見如下代碼api
@Getter @Setter public class FishermanDemo { private String username; private Integer time; public String getUsername(){ System.out.println("hello world"); return "hello username"; } public void setTime(Integer time){ System.out.println("hello time"); this.time = time; } }
編譯後的class文件springboot
public class FishermanDemo { private String username; private Integer time; public FishermanDemo() { } public String getUsername() { System.out.println("hello world"); return "hello username"; } public void setTime(Integer time) { System.out.println("hello time"); this.time = time; } public Integer getTime() { return this.time; } public void setUsername(String username) { this.username = username; } }
咱們能夠看出,lombok編譯後的代碼不會覆蓋咱們本身寫的getter/setter方法。通常狀況下,咱們不會本身寫getter/setter方法,可是也有些特殊的地方。好比POJO對象若是有時間類型,而且保存的類型和數據庫字段不一致,那麼這個時候就須要本身定義該時間類型的getter/setter方法,由於像Mybatis這樣的框架是經過getter/setter方法來獲取和注入值的。框架
咱們看源文件工具
@Data public class FishermanDemo { private String username; private Integer time; }
反編譯後的文件開發工具
public class FishermanDemo { private String username; private Integer time; public FishermanDemo() { } public String getUsername() { return this.username; } public Integer getTime() { return this.time; } public void setUsername(String username) { this.username = username; } public void setTime(Integer time) { this.time = time; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof FishermanDemo)) { return false; } else { FishermanDemo other = (FishermanDemo)o; if (!other.canEqual(this)) { return false; } else { Object this$username = this.getUsername(); Object other$username = other.getUsername(); if (this$username == null) { if (other$username != null) { return false; } } else if (!this$username.equals(other$username)) { return false; } Object this$time = this.getTime(); Object other$time = other.getTime(); if (this$time == null) { if (other$time != null) { return false; } } else if (!this$time.equals(other$time)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof FishermanDemo; } public int hashCode() { int PRIME = true; int result = 1; Object $username = this.getUsername(); int result = result * 59 + ($username == null ? 43 : $username.hashCode()); Object $time = this.getTime(); result = result * 59 + ($time == null ? 43 : $time.hashCode()); return result; } public String toString() { return "FishermanDemo(username=" + this.getUsername() + ", time=" + this.getTime() + ")"; } }
咱們能夠看到 反編譯後的文件有 getter/setter、無參構造器、equal、hascode、toString。咱們常常使用的POJO對象通常只有getter/setter、無參構造器、有參數構造器、toString。所以咱們能夠用如下5個註解。this
@Setter @Getter @NoArgsConstructor @AllArgsConstructor @ToString
這個屬於POJO對象基本約束規範,不要使用基本數據類型。spa
lombok對基本數據類型boolean反編譯後的結果和Boolean類型有一些不一致。
假設private boolean sex, boolean基本類型sex的getter/setter方法以下,isSex和setSex,而Boolean就是正常的getSex和setSex
使用lombok的註解 @ToString 打印出來的結果以下:
Student(name=Mahesh, age=21) // name後面的值 沒有''
而使用IDEA 自動生成的toString方法 打印出來的結果以下:
Student{name='Mahesh', age=21} // name 後面的值 有''
能夠看出來,IDEA自動生成的ToString方法,若是屬性是字符串,那麼調用toString方法的時候,會比lombok的toString方法多一個 ''
使用lombok有一個最大的缺陷,就是在團隊中全部開發人員都須要安裝相關的lombok插件
lombok很神奇,很咱們以往使用jar包徹底不同,它必需要求開發工具安裝相應的jar包,緣由就是跟lombok底層實現原理有很大的關係。
lombok利用JSR269 api(Pluggable Annotation Processing API )建立編譯期的註解處理器,注意全部的@Getter、@Setter、@Data、@ToString方法都是編譯期註解 @Retention(RetentionPolicy.SOURCE)
這跟springboot等在運行期間利用反射獲取註解相關的值徹底不同。而lombok可以在編譯期就完成這些難以想象的工做,徹底是由於JSR269的規範,容許在編譯時指定一個processor類來對編譯階段的註解進行干預。
簡單一句話,經過JSR269規範,容許你對一個類,在編譯期間進行相應的更改,好比增長一些方法。
所以相關的開發工具例如IDEA、Eclipse徹底不知道這些方法的存在
@Getter public class FishermanDemo { private String username; }
反編譯後的class文件
public class FishermanDemo { private String username; public FishermanDemo() { } public String getUsername() { return this.username; } }
若是這個時候直接調用getUsername()
FishermanDemo fishermanDemo = new FishermanDemo(); fishermanDemo.getUsername();
開發工具的編譯期會報錯,由於他們徹底不知道getUsername()方法的存在,所以必須安裝相關的lombok插件,才能使開發工具不報錯。
參考資料
https://blog.mythsman.com/2017/12/19/1/#more
https://zhuanlan.zhihu.com/p/32779910