SpringBoot | 第二章:lombok 介紹及簡單使用
(點擊
上方公眾號
,可快速關注)
來源:oKong ,
blog.lqdev.cn/2018/07/12/springboot/chapter-two/
在去北京培訓的時候,講師說到了lombok這個第三方插件包,使用了之後發現,確實是個神奇,避免了編寫很多臃腫的且定式的代碼,雖然現代的IDE都能通過快捷鍵或者右鍵的方式,使用Generate Getters and Setters快速生成setters/getters,但當某一個欄位修改或者添加欄位時,又需要重複的操作一遍,但使用了lombok之後。一切都是自動的,除了最常用的生成setters/getters,還有諸如:自動生成toString方法、equals、·haashcode·等,還能快速生成Builder模式的javabean類,實在是方便。程序猿是很懶的,一切重複的工作都想通過腳本或者自動化工具來完成,所以,使用lombok吧。
為何要使用Lombok
我們在開發過程中,通常都會定義大量的JavaBean,然後通過IDE去生成其屬性的構造器、getter、setter、equals、hashcode、toString方法,當要增加屬性或者對某個屬性進行改變時,比如命名、類型等,都需要重新去生成上面提到的這些方法。這樣重複的勞動沒有任何意義,Lombok裡面的註解可以輕鬆解決這些問題。
簡化冗餘的JavaBean代碼,使得實體文件很簡潔。
大大提高JavaBean中方法的執行效率,省去重複的步驟
Lombok簡介
Lombok是一個可以通過簡單的註解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,通過使用對應的註解,可以在編譯源碼的時候生成對應的方法。
官方地址:https://projectlombok.org/ github地址:https://github.com/rzwitserloot/lombok
官網對其解釋為:
這裡簡單說下lombok實現的原理:主要是通過抽象語法樹(AST),在編譯處理後,匹配到有其註解的類,那麼註解編譯器就會自動去匹配項目中的註解對應到在lombok語法樹中的註解文件,並經過自動編譯匹配來生成對應類中的getter或者setter方法,達到簡化代碼的目的。
利用此原理,也可自行編寫一些工作中一些經常使用到的,比如實體類轉Map對象,map對象轉實體類,原本使用Beanutils或者cglib的BeanCopier實現轉換,前者使用的是反射的機制,所以性能相對較差,後者是使用修改位元組碼技術,性能在未使用Converter時基本等同於set和get方法。但說白了還是麻煩,畢竟還需要緩存對象等做到復用等。而使用lombok的形式的話,一切都是自動的,性能基本是沒有損失的,由於對AST不熟悉,之後有時間了可以進行插件編寫下(去官網提過這個問題,官方回復說,不太符合lombok的使用場景,⊙﹏⊙‖∣,還是自己動手,風衣足食吧~)
eclipse 安裝
1. 下載 lombok.jar 包
2. 運行lombok.jar包,會自動掃描系統的ide安裝情況(或者手動指定目錄),點擊Install/Update,即可。
3. 不運行jar包情況下,可直接指定eclipse.ini文件,設置javaagent屬性即可(第二種方法最後的效果也是這樣的。):
Lombok使用
添加maven依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
常用註解介紹
@Getter / @Setter:可以作用在類上和屬性上,放在類上,會對所有的非靜態(non-static)屬性生成Getter/Setter方法,放在屬性上,會對該屬性生成Getter/Setter方法。並可以指定Getter/Setter方法的訪問級別。
@EqualsAndHashCode :默認情況下,會使用所有非瞬態(non-transient)和非靜態(non-static)欄位來生成equals和hascode方法,也可以指定具體使用哪些屬性。 @ToString 生成toString方法,默認情況下,會輸出類名、所有屬性,屬性會按照順序輸出,以逗號分割。
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:無參構造器、部分參數構造器、全參構造器
** @Data:包含@ToString, @EqualsAndHashCode, 所有屬性的@Getter, 所有non-final屬性的@Setter和@RequiredArgsConstructor的組合,通常情況下,基本上使用這個註解就足夠了。**
@Budilder:可以進行Builder方式初始化。
@Slf4j:等同於:private final Logger logger = LoggerFactory.getLogger(XXX.class);簡直不能更爽了!一般上用在其他java類上
更多註解說明,可查看:https://projectlombok.org/features/index.html
簡單使用示例
使用lombok
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Demo {
String code;
String name;
}
等同於
public class Demo {
String code;
String name;
public static DemoBuilder builder() {
return new DemoBuilder();
}
public String getCode() {
return this.code;
}
public String getName() {
return this.name;
}
public void setCode(String code) {
this.code = code;
}
public void setName(String name) {
this.name = name;
}
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Demo))
return false;
Demo other = (Demo) o;
if (!other.canEqual(this))
return false;
Object this$code = getCode();
Object other$code = other.getCode();
if (this$code == null ? other$code != null : !this$code.equals(other$code))
return false;
Object this$name = getName();
Object other$name = other.getName();
return this$name == null ? other$name == null : this$name.equals(other$name);
}
protected boolean canEqual(Object other) {
return other instanceof Demo;
}
public int hashCode() {
int PRIME = 59;
int result = 1;
Object $code = getCode();
result = result * 59 + ($code == null ? 43 : $code.hashCode());
Object $name = getName();
return result * 59 + ($name == null ? 43 : $name.hashCode());
}
public String toString() {
return "Demo(code=" + getCode() + ", name=" + getName() + ")";
}
public Demo() {
}
public Demo(String code, String name) {
this.code = code;
this.name = name;
}
public static class DemoBuilder {
private String code;
private String name;
public DemoBuilder code(String code) {
this.code = code;
return this;
}
public DemoBuilder name(String name) {
this.name = name;
return this;
}
public Demo build() {
return new Demo(this.code, this.name);
}
public String toString() {
return "Demo.DemoBuilder(code=" + this.code + ", name=" + this.name + ")";
}
}
}
使用@Slf4j(摘抄至官網)
@Slf4j
public class LogExampleOther {
public static void main(String... args) {
log.error("Something else is wrong here");
}
}
常規的
public class LogExampleOther {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);
public static void main(String... args) {
log.error("Something else is wrong here");
}
}
省了多少事!!!少年快使用吧!
系列
SpringBoot | 第一章:第一個 SpringBoot 應用
【關於投稿】
如果大家有原創好文投稿,請直接給公號發送留言。
① 留言格式:
【投稿】+《 文章標題》+ 文章鏈接
② 示例:
【投稿】《不要自稱是程序員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/
③ 最後請附上您的個人簡介哈~
看完本文有收穫?請轉發分享給更多人
關注「ImportNew」,提升Java技能
※SpringBoot | 第四章 :日誌管理
※MySQL 性能優化 : 索引和查詢優化
TAG:ImportNew |