1. 程式人生 > >SpringCloud工作筆記065---lombok的使用和原理_在開發工具STS_eclipse_Idea中整合lombok

SpringCloud工作筆記065---lombok的使用和原理_在開發工具STS_eclipse_Idea中整合lombok

  JAVA技術交流QQ群:170933152 

簡單說就是在類中不用再寫:get set方法,hashcode toStirng equals方法了

 

 eclipse中整合:

update時,勾選上Force Update of Snapshots/Releases)

首先下載一個Lombok的jar包--https://projectlombok.org/download.html

雙擊lombok.jar,它會自動檢測到eclipse的安裝路徑,點選"install/update"按鈕,然後重新啟動eclipse。

eclipse.ini檔案中會出現-javaagent:D:\eclipse\eclipse\lombok.jar,說明引入成功。

重啟之後,在專案的pom.xml檔案中引入Lombok.jar:

      <dependency>  
          <groupId>org.projectlombok</groupId>  
          <artifactId>lombok</artifactId>  
          <version>1.16.20</version>  
          <scope>provided</scope>  
      </dependency> 

--------------------

idea中整合:

IntelliJ IDEA lombok外掛的安裝和使用

分步閱讀

IntelliJ IDEA是一款非常優秀的整合開發工具,功能強大,而且外掛眾多。lombok是開源的程式碼生成庫,是一款非常實用的小工具,我們在編輯實體類時可以通過lombok註解減少getter、setter等方法的編寫,在更改實體類時只需要修改屬性即可,減少了很多重複程式碼的編寫工作。本文小編只介紹IntelliJ IDEA中lombok外掛的安裝和配置以及簡單的使用方法,更多請大家參考下文lombok在Eclipse下的使用,裡面包含了使用方法和常用lombok註解的介紹。

2Eclipse安裝Lambok及Lambok的使用介紹

工具/原料

  • IntelliJ IDEA

  • 聯網

lombok外掛的安裝

  1. 1

    首先我們需要安裝IntelliJ IDEA中的lombok外掛,開啟IntelliJ IDEA後點擊選單欄中的File-->Settings,或者使用快捷鍵Ctrl+Alt+S進入到設定頁面。

    IntelliJ IDEA lombok外掛的安裝和使用

  2. 2

    我們點選設定中的Plugins進行外掛的安裝,在右側選擇Browse repositories...,然後在搜尋頁面輸入lombok變可以查詢到下方的Lombok Plugin,滑鼠點選Lombok Plugin可在右側看到Install按鈕,點選該按鈕便可安裝。

    IntelliJ IDEA lombok外掛的安裝和使用

    IntelliJ IDEA lombok外掛的安裝和使用

    IntelliJ IDEA lombok外掛的安裝和使用

    IntelliJ IDEA lombok外掛的安裝和使用

  3. 3

    我們在安裝頁面可以看到lombok具體支援的所有註解,在安裝過程中有Downloading Plugins的提示,安裝過程中進度條會變化。需要提醒的是,在安裝過程中一定要保證網路連線可用且良好,否則可能會安裝失敗。安裝成功後我們可以看到右側的Restart按鈕,此時可先不操作,因為我們還有後續的配置工作。安裝完成後我們再回到Plugins,此時在右側可以搜尋到lombok,而安裝前是不行的。

    IntelliJ IDEA lombok外掛的安裝和使用

    IntelliJ IDEA lombok外掛的安裝和使用

    IntelliJ IDEA lombok外掛的安裝和使用

    IntelliJ IDEA lombok外掛的安裝和使用

    END

配置註解處理器

  1. 1

    同樣我們在Settings設定頁面,我們點選Build,Execution,Deployment-->選擇Compiler-->選中Annotation Processors,然後在右側勾選Enable annotation processing即可。

    IntelliJ IDEA lombok外掛的安裝和使用

    IntelliJ IDEA lombok外掛的安裝和使用

    END

lombok外掛的使用

  1. 使用前我們需要說明的是安裝的外掛只是一個呼叫,就像我們使用maven外掛一樣,本機需要安裝maven才行。我們在使用lombok前也需要新增lombok的依賴。lombok的版本一直在更新,大家可以在百度搜索框輸入lombok maven找到最新的依賴版本。

    <dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.16.10</version></dependency>

    IntelliJ IDEA lombok外掛的安裝和使用

  2. 接下來我們編輯一個實體類Student,新增三個屬性,最後在類上新增@Data屬性,這個註解可以幫我們在.class檔案中生成類中所有屬性的get/set方法、equals、canEqual、hashCode、toString方法等。

    IntelliJ IDEA lombok外掛的安裝和使用

  3. 那麼編輯完程式碼後我們如何檢視生成的方法呢?在選單欄點選View-->Tool Windows-->Structure,便可以看到類中所有的方法了,這些都是lombok幫我自動生成的。

    IntelliJ IDEA lombok外掛的安裝和使用步驟閱讀

    IntelliJ IDEA lombok外掛的安裝和使用

    END

注意事項

  • 安裝lombok外掛過程中需要聯網,另外安裝需要配置Annotation Processors支援。

-------------------

sts中整合:

引言:Spring Boot是非常高效的開發框架,lombok是一套程式碼模板解決方案,將極大提升開發的效率,這裡介紹給大家使用。

1. Lombok

  Lombok想要解決了的是在我們實體Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不會用到,但是某些時候仍然需要複寫,以期方便使用的方法;在使用Lombok之後,將由其來自動幫你實現程式碼生成,注意,其是在執行過程中,幫你自動生成的。就是說,將極大減少你的程式碼總量。

  Lombok的官方地址: https://projectlombok.org/

2. LomBok的安裝

   在SpringBoot1.4.1專案的pom.xml中新增如下資訊:

<dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
 注意這裡無需指定版本,因為Spring Boot中已經預設引入了這個類庫,且指定了其scope。 這個即將lombok引入了專案,可以引用其類庫標註。
  針對不同的IDE,lombok提供了不同的解決方案,筆者使用的是STS,故這介紹一下如何使用lombok外掛在STS中:

  >> 1.  下載最新的lombok,最新版本。1.16.10  https://projectlombok.org/download.html

  >> 2.  切到lombok下載的目錄,執行命令: java -jar lombok.jar

   

   選中目錄之後,就會看到如下視窗:

    

     大家可以看到,這裡的會使用javaagent的方式寫入STS的啟動過程中。在確定之後,我們切到sts的安裝目錄,驗證一下STS.ini檔案:

      

     大家也可以發現,在STS的目錄下,也有lombok.jar檔案的存在,整個安裝過程即可完成。

3.   Lombok的使用

       主要是基於標註來進行資訊的封裝和使用:

       @NonNull:  標識物件是否為空,為空則丟擲異常

       @Getter:   自動生成Getter方法

       @Setter:  自動生成Setter

        @ToString:  覆蓋tostring方法

        @EqualsAndHashCode: 覆蓋equal和hashCode方法

    @Data:  @Getter/@Setter, @ToString, @EqualAndHashCode等組合

     @@NoArgsConstructor @AllArgsConstructor註解使用

    @Slf4j:  預設使用slf4j的日誌物件

4. 使用示例:

    示例Getter/Setter方法以及日誌使用:

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
 
@Slf4j
@Data
public class TestBean {
    private String name;
    private int age;
}
  測試用例:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
 
import lombok.extern.slf4j.Slf4j;
 
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class TestEntityBean {
 
    TestBean bean = new TestBean();
    
    @Autowired
    private MyCase mycase;
    
    
    //@Test
    public void test() {
       bean.setAge(123);
       bean.setName("zhangsan");
       
       log.info(bean.toString());
    }
}
 用例執行結果 

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.4.1.RELEASE)
 
2016-10-24 11:49:19.521  INFO 700 --- [           main] org.cuckoo.report.brain.TestEntityBean   : Starting TestEntityBean on 08-201412015324 with PID 700 (started by junfengchen in D:\Dev\workspace\JSPDemo)
2016-10-24 11:49:19.523  INFO 700 --- [           main] org.cuckoo.report.brain.TestEntityBean   : No active profile set, falling back to default profiles: default
2016-10-24 11:49:19.647  INFO 700 --- [           main] o.s.w.c.s.GenericWebApplicationContext   : Refreshing org.s[email protected]4f80542f: startup date [Mon Oct 24 11:49:19 CST 2016]; root of context hierarchy
2016-10-24 11:49:22.191  INFO 700 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.s[email protected]4f80542f: startup date [Mon Oct 24 11:49:19 CST 2016]; root of context hierarchy
2016-10-24 11:49:22.290  INFO 700 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/foo]}" onto public java.lang.String org.cuckoo.report.brain.WelcomeController.foo(java.util.Map<java.lang.String, java.lang.Object>)
2016-10-24 11:49:22.293  INFO 700 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/],methods=[GET]}" onto public java.lang.String org.cuckoo.report.brain.WelcomeController.welcome(java.util.Map<java.lang.String, java.lang.Object>)
2016-10-24 11:49:22.295  INFO 700 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2016-10-24 11:49:22.296  INFO 700 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2016-10-24 11:49:22.351  INFO 700 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-10-24 11:49:22.351  INFO 700 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-10-24 11:49:22.409  INFO 700 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-10-24 11:49:22.642  INFO 700 --- [           main] org.cuckoo.report.brain.TestEntityBean   : Started TestEntityBean in 3.868 seconds (JVM running for 4.854)
2016-10-24 11:49:22.676  INFO 700 --- [           main] org.cuckoo.report.brain.TestEntityBean   : TestBean(name=zhangsan, age=123)
2016-10-24 11:49:22.691  INFO 700 --- [       Thread-2] o.s.w.c.s.GenericWebApplicationContext   : Closing org.s[email protected]4f80542f: startup date [Mon Oct 24 11:49:19 CST 2016]; root of context hierarchy

  大家可以注意到@Slf4j替代掉了冗餘的logger宣告語句, @Data不必在使用Getter/Setter方法,其中toString預設反射物件中的所有屬性,非常的好用。
--------------------- ---------------

這裡是介紹的原理:

一、專案背景
在寫Java程式的時候經常會遇到如下情形:
新建了一個Class類,然後在其中設定了幾個欄位,最後還需要花費很多時間來建立getter和setter方法
lombok專案的產生就是為了省去我們手動建立getter和setter方法的麻煩,它能夠在我們編譯原始碼的時候自動幫我們生成getter和setter方法。即它最終能夠達到的效果是:在原始碼中沒有getter和setter方法,但是在編譯生成的位元組碼檔案中有getter和setter方法
比如原始碼檔案:
import java.io.Serializable;
 
 
import lombok.Data;
 
 
@Data
public class BasicClusterInfo implements Serializable {
 
 
    private static final long serialVersionUID = 3478135817352393604L;
    private String            hbaseKey;
    private int               receiverCount;
}


以下是編譯上述原始碼檔案得到的位元組碼檔案,對其反編譯得到的結果
public class BasicClusterInfo extends java.lang.Object implements java.io.Serializable{
    public BasicClusterInfo();
    public java.lang.String getHbaseKey();
    public int getReceiverCount();
    public void setHbaseKey(java.lang.String);
    public void setReceiverCount(int);
    public boolean equals(java.lang.Object);
    public boolean canEqual(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
}


二、使用方法
使用lombok專案的方法很簡單,分為四個步驟:
1)在需要自動生成getter和setter方法的類上,加上@Data註解
2)在編譯類路徑中加入lombok.jar包
3)使用支援lombok的編譯工具編譯原始碼(關於支援lombok的編譯工具,見“四、支援lombok的編譯工具”)
4)編譯得到的位元組碼檔案中自動生成了getter和setter方法


三、原理分析
接下來進行lombok能夠工作的原理分析,以Oracle的javac編譯工具為例。
自從Java 6起,javac就支援“JSR 269 Pluggable Annotation Processing API”規範,只要程式實現了該API,就能在javac執行的時候得到呼叫。
舉例來說,現在有一個實現了"JSR 269 API"的程式A,那麼使用javac編譯原始碼的時候具體流程如下:
1)javac對原始碼進行分析,生成一棵抽象語法樹(AST)
2)執行過程中呼叫實現了"JSR 269 API"的A程式
3)此時A程式就可以完成它自己的邏輯,包括修改第一步驟得到的抽象語法樹(AST)
4)javac使用修改後的抽象語法樹(AST)生成位元組碼檔案
詳細的流程圖如下:

lombok本質上就是這樣的一個實現了"JSR 269 API"的程式。在使用javac的過程中,它產生作用的具體流程如下:
1)javac對原始碼進行分析,生成一棵抽象語法樹(AST)
2)執行過程中呼叫實現了"JSR 269 API"的lombok程式
3)此時lombok就對第一步驟得到的AST進行處理,找到@Data註解所在類對應的語法樹(AST),然後修改該語法樹(AST),增加getter和setter方法定義的相應樹節點
4)javac使用修改後的抽象語法樹(AST)生成位元組碼檔案


四、支援lombok的編譯工具
1)由“三、原理分析”可知,Oracle javac直接支援lombok
2)常用的專案管理工具Maven所使用的java編譯工具來源於配置的第三方工具,如果我們配置這個第三方工具為Oracle javac的話,那麼Maven也就直接支援lombok了
3)Intellij Idea配置的編譯工具為Oracle javac的話,也就直接支援lombok了。
4)Eclipse中使用的不是Oracle javac這個編譯工具,而是自己實現的Eclipse Compiler for Java (ECJ).要想使ECJ支援lombok,得進行設定,具體是在Eclipse程式目錄中的eclipse.ini檔案中新增如下兩行設定:
-javaagent:[lombok.jar所在路徑]
-Xbootclasspath/a:[lombok.jar所在路徑]


五、其他問題
現在使用Intellij Idea作為Java專案的IDE,配置Oracle javac作為編譯工具。
現在有一個A類,其中有一些欄位,沒有建立它們的setter和getter方法,使用了lombok的@Data註解,另外有一個B類,它呼叫了A類例項的相應欄位的setter和getter方法
編譯A類和B類所在的專案,並不會報錯,因為最終生成的A類位元組碼檔案中存在相應欄位的setter和getter方法
但是,IDE發現B類原始碼中所使用的A類例項的setter和getter方法在A類原始碼中找不到定義,IDE會認為這是錯誤
要解決以上這個不是真正錯誤的錯誤,可以下載安裝Intellij Idea中的"Lombok plugin"。


六、lombok的罪惡
使用lombok雖然能夠省去手動建立setter和getter方法的麻煩,但是卻大大降低了原始碼檔案的可讀性和完整性,降低了閱讀原始碼的舒適度。


參考文獻:
[1]http://stackoverflow.com/questions/6107197/how-does-lombok-work
[2]https://projectlombok.org/download.html
[3]http://stackoverflow.com/questions/3061654/what-is-the-difference-between-javac-and-the-eclipse-compiler
[4]http://www.ibm.com/developerworks/library/j-lombok/
[5]http://notatube.blogspot.com/2010/12/project-lombok-creating-custom.html