1. 程式人生 > >springboot中使用lombok

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註解使用

 [email protected]

  @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的過程中,它產生作用的具體流程如下:

  1. javac對原始碼進行分析,生成了一棵抽象語法樹(AST)
  2. 執行過程中呼叫實現了“JSR 269 API”的Lombok程式
  3. 此時Lombok就對第一步驟得到的AST進行處理,找到@Data註解所在類對應的語法樹(AST),然後修改該語法樹(AST),增加getter和setter方法定義的相應樹節點
  4. javac使用修改後的抽象語法樹(AST)生成位元組碼檔案,即給class增加新的節點(程式碼塊)

拜讀了Lombok原始碼,對應註解的實現都在HandleXXX中,比如@Getter註解的實現時HandleGetter.handle()。還有一些其它類庫使用這種方式實現,比如Google AutoDagger等等。

參考文章:https://blog.csdn.net/qq_36314960/article/details/79565899 

                 https://www.cnblogs.com/heyonggang/p/8638374.html