springboot中使用lombok
Lombok會使你的程式碼簡介且提高你的編碼效率,引起程式碼的舒適感。關於lombok的介紹就不多說了,可以參考官網,直接進入正題。
pom檔案中引入依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <scope>provided</scope> </dependency>
我使用的編譯環境是IDEA,需安裝lombok的外掛才能正常使用,安裝如下
安裝完之後如果還報錯,可進入如下修改:需要修改配置
settings—>Build,Execution,Deployment—>Compiler—>Annotation Processors中
將Enable annotation procession
複選框給勾選上.上圖比較直接
經過以上配置就可以使用lombok。
Lombok註解使用
@Data是比較處理度的註解,包括setter/getter、equals、canEqual、hashCode、toString、NoArgsConstructor方法,如為final屬性,則不會為該屬性生成setter方法。
未使用@Data的程式碼:
public class Student { String name; Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
使用@Data:
@Data
public class User {
private String name;
private Integer age;
}
2.使用@Getter、@Setter、@ToString:
可以這樣:
@ToString
@Setter
@Getter
public class User {
private String name;
private Integer age;
}
也可以這樣:
@ToString
public class User {
@Setter
@Getter
private String name;
@Setter
@Getter
private Integer age;
}
3.使用@Slf4j/@Log4j
在需要輸出日誌的類上新增@Slf4j/@Log4j,在程式中舊可以使用log.debug()進行日誌輸出。
4.各個註解的解釋
@Data註解:在JavaBean或類JavaBean中使用,這個註解包含範圍最廣,它包含getter、setter、NoArgsConstructor註解,即當使用當前註解時,會自動生成包含的所有方法;
@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方法即可;
@NonNull註解:該註解用在屬性或構造器上,Lombok會生成一個非空的宣告,可用於校驗引數,能幫助避免空指標。
在使用以上註解需要處理引數時,處理方法如下(以@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引數;
關於其他的註解你可以去jar中去看原始碼,很容易看懂。
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等等。
參考文章:https://blog.csdn.net/qq_36314960/article/details/79565899