第二十九章:基于SpringBoot平臺使用Lombok來優(yōu)雅的編碼

Lombok對于Java偷懶開發(fā)者來說應(yīng)該是比較中意的,恰恰筆者就是一個喜歡在小細(xì)節(jié)上偷懶來提高開發(fā)效率的人。所以在技術(shù)框架的海洋里尋找了很久才在GitHub開源平臺上找到,而在這之前國外很多程序猿一直使用該框架了,Lombok框架提供了很多編碼遍歷,但是也降低了代碼的閱讀力。下面我們看看在Idea開發(fā)工具中該怎么使用Lombok?

本章目標(biāo)

使用Lombok提高開發(fā)效率。

免費教程專題

恒宇少年在博客整理三套免費學(xué)習(xí)教程專題,由于文章偏多特意添加了閱讀指南,新文章以及之前的文章都會在專題內(nèi)陸續(xù)填充,希望可以幫助大家解惑更多知識點。


SpringBoot 企業(yè)級核心技術(shù)學(xué)習(xí)專題

專題 專題名稱 專題描述
001 Spring Boot 核心技術(shù) 講解SpringBoot一些企業(yè)級層面的核心組件
002 Spring Boot 核心技術(shù)章節(jié)源碼 Spring Boot 核心技術(shù)簡書每一篇文章碼云對應(yīng)源碼
003 Spring Cloud 核心技術(shù) 對Spring Cloud核心技術(shù)全面講解
004 Spring Cloud 核心技術(shù)章節(jié)源碼 Spring Cloud 核心技術(shù)簡書每一篇文章對應(yīng)源碼
005 QueryDSL 核心技術(shù) 全面講解QueryDSL核心技術(shù)以及基于SpringBoot整合SpringDataJPA
006 SpringDataJPA 核心技術(shù) 全面講解SpringDataJPA核心技術(shù)
007 SpringBoot核心技術(shù)學(xué)習(xí)目錄 SpringBoot系統(tǒng)的學(xué)習(xí)目錄,敬請關(guān)注點贊?。?

構(gòu)建項目

本章的項目不涉及數(shù)據(jù)訪問,所以添加的依賴也比較少,pom.xml配置文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yuqiyu</groupId>
    <artifactId>chapter29</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>chapter29</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--web依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--lombok依賴-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

lombok的依賴僅僅只有一個,lombok基于配置在編譯class文件時會自動將指定模板的內(nèi)容寫入。

創(chuàng)建實體

為了方便演示lombok的神奇之處,我們簡單創(chuàng)建一個用戶實體,基于該實體進(jìn)行配置lombok注解,實體代碼如下所示:

package com.yuqiyu.chapter29.bean;

/**
 * 用戶實體>>>測試lombok
 * ========================
 * Created with IntelliJ IDEA.
 * User:恒宇少年
 * Date:2017/8/4
 * Time:23:07
 * 碼云:http://git.oschina.net/jnyqy
 * ========================
 */
public class UserBean
{
    //名稱
    private String name;
    //年齡
    private int age;
    //家庭住址
    private String address;
}

下面我們先來看看我們最常用的getter/setter基于lombok如何使用。

Getter/Setter

Getter/Setter注解作用域可以是實體類也可以是具體的屬性字段,下面我們僅僅對name屬性添加注解,代碼如下所示:

    //...省略
    //名稱
    @Getter
    @Setter
    private String name;

如果想讓lombok生效我們還需要針對idea工具進(jìn)行插件的安裝,下面我們按照順序打開Idea配置File > Settings > Plugins > Browse repositories... > 輸入lombok,插件就會被自動檢索出來,界面如下圖1所示:

圖1

我的工具已經(jīng)安裝了該插件,所有在右側(cè)是沒有任何按鈕的,如果你的工具沒有安裝該插件,右側(cè)會有一個綠色的按鈕,按鈕的內(nèi)容則是Install,點擊安裝后重啟Idea就可以了。
為了方便我們直接使用SpringBoot項目為我們創(chuàng)建的測試類(位置:com.yuqiyu.chapter29.Chapter29ApplicationTests)來驗證我們的lombok注解是否已經(jīng)生效,測試類代碼如下所示:

package com.yuqiyu.chapter29;

import com.yuqiyu.chapter29.bean.UserBean;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
//@RunWith(SpringRunner.class)
//@SpringBootTest
public class Chapter29ApplicationTests {

    @Test
    public void testLombok()
    {
        //測試Getter/Setter
        UserBean user = new UserBean();
        user.setName("測試lombok");
        System.out.println(user.getName());
    }
}

可以看到我們可以正常使用name屬性的getter/setter方法,但是其他屬性的卻是無法調(diào)用,下面我們修改注解Getter/Setter位置,配置到實體類上。修改后的代碼如下所示:

//省略...
@Getter
@Setter
public class UserBean
{
    //名稱
    private String name;
    //年齡
    private int age;
    //家庭住址
    private String address;
}

我們再來測試下其他屬性是否可以訪問到了,測試類修改代碼如下所示:

//省略...
@Test
    public void testLombok()
    {
        //測試Getter/Setter
        UserBean user = new UserBean();
        user.setName("測試lombok");
        user.setAge(10);
        user.setAddress("測試地址");

        System.out.println(user.getName()+"  " + user.getAge() +"  "+user.getAddress());
    }

可以看到我們修改配置位置后UserBean實體內(nèi)的所有屬性都具備了Getter/Setter方法,這樣我們在開發(fā)中就不需要再去做多余的生成操作了。

注意:如果你的屬性Getter/Setter需要做特殊處理,那么直接使用原始方法實現(xiàn)即可,Lombok檢查到存在自定義的方法后不會再做生成處理。

ToString

除了上述的Getter/SetterLombok還為我們提供了自動生成toString方法的注解@ToString,該注解的作用域僅僅是在實體類上,我們修改實體類添加該注解,在測試類中調(diào)用toString方法查看輸出內(nèi)容如下:

System.out.println(user.toString());
//輸出:
UserBean(name=測試lombok, age=10, address=sss測試地址)

Lombok自動創(chuàng)建的toString方法會將所有的屬性都包含并且調(diào)用后可以輸出。

AllArgsConstructor

Lombok還提供了全部參數(shù)的構(gòu)造函數(shù)的自動生成,該注解的作用域也是只有在實體類上,因為只有實體類才會存在構(gòu)造函數(shù)。修改添加該注解并且測試調(diào)用,如下所示:

UserBean u = new UserBean("構(gòu)造lombok",1,"測試地址");
//輸出:
UserBean(name=構(gòu)造lombok, age=1, address=sss測試地址)

注意:該注解配置后會自動生成一個具體全部參數(shù)的構(gòu)造函數(shù),參數(shù)的順序與屬性定義的順序一致。

NoArgsConstructor

當(dāng)然除了全部參數(shù)的構(gòu)造函數(shù),Lombok還提供了沒有參數(shù)的構(gòu)造函數(shù),使用方式與@AllArgsConstructor一致。

到這里也許你就有疑問了,我為了一個類添加這么多注解麻煩嗎?還不如工具生成getter/setter來的快呢,那好Lombok針對這個問題也做出了解決方案。

Data

我們使用@Data注解就可以涵蓋@ToString、@Getter、@Setter方法,當(dāng)然我們使用構(gòu)造函數(shù)時還是需要單獨添加注解,下面我們修改實體類添加@Data注解代碼如下所示:

/*@Getter
@Setter
@ToString*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserBean
{
    //名稱
    private String name;
    //年齡
    private int age;
    //家庭住址
    private String address;

    public String getAddress() {
        return "sss"+address;
    }
}

我們將@ToString、@Getter@Setter三個注解注釋掉后添加@Data,按照官方所說這時我們的測試類應(yīng)該不會出現(xiàn)任何的異常,我們打開測試類查看是否正常。
查看后果然,沒有出現(xiàn)任何的異常,這也說明了@Data注解確實涵蓋了上面三個注解。

Slf4j

還有一個利器,Lombok為我們內(nèi)置了各種日志組件的支持,我們在SpringBoot項目開發(fā)中幾乎都是使用logback作為日志組件,而logback是基于slf4j完成的。所以我們在實體類上直接添加@Slf4j就可以自動創(chuàng)建一個日志對象作為類內(nèi)全局字段,自動創(chuàng)建的代碼如下所示:

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Chapter29ApplicationTests.class);

為了測試我在Chapter29ApplicationTests測試類上添加了@Slf4j,調(diào)用效果如下所示:

//調(diào)用:
log.info(u.toString());
//輸出:
23:55:46.100 [main] INFO com.yuqiyu.chapter29.Chapter29ApplicationTests - UserBean(name=構(gòu)造lombok, age=1, address=sss測試地址)

總結(jié)

以上內(nèi)容就是本章的全部講述,本章主要講解Lombok用于便于開發(fā)的注解組件。Lombok雖然提供的組件不多,但是每一個都是我們需要的,正是因為如此從而大大減少了我們的工作量,尤其是這種不起眼卻又不得不寫的代碼。Lombok官方文檔地址

本章代碼已經(jīng)上傳到碼云:
SpringBoot配套源碼地址:https://gitee.com/hengboy/spring-boot-chapter
SpringCloud配套源碼地址:https://gitee.com/hengboy/spring-cloud-chapter

作者個人 博客
使用開源框架 ApiBoot 助你成為Api接口服務(wù)架構(gòu)師

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容