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

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

本章目標(biāo)

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

免費(fèi)教程專題

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


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)注點(diǎn)贊2痢鲜棠!!

構(gòu)建項(xiàng)目

本章的項(xiàng)目不涉及數(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的依賴僅僅只有一個(gè)岔留,lombok基于配置在編譯class文件時(shí)會自動(dòng)將指定模板的內(nèi)容寫入夏哭。

創(chuàng)建實(shí)體

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

package com.yuqiyu.chapter29.bean;

/**
 * 用戶實(shí)體>>>測試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注解作用域可以是實(shí)體類也可以是具體的屬性字段里逆,下面我們僅僅對name屬性添加注解,代碼如下所示:

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

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

圖1

我的工具已經(jīng)安裝了該插件偎血,所有在右側(cè)是沒有任何按鈕的诸衔,如果你的工具沒有安裝該插件,右側(cè)會有一個(gè)綠色的按鈕颇玷,按鈕的內(nèi)容則是Install笨农,點(diǎn)擊安裝后重啟Idea就可以了。
為了方便我們直接使用SpringBoot項(xiàng)目為我們創(chuàng)建的測試類(位置:com.yuqiyu.chapter29.Chapter29ApplicationTests)來驗(yàn)證我們的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位置空郊,配置到實(shí)體類上份招。修改后的代碼如下所示:

//省略...
@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實(shí)體內(nèi)的所有屬性都具備了Getter/Setter方法狞甚,這樣我們在開發(fā)中就不需要再去做多余的生成操作了锁摔。

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

ToString

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

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

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

AllArgsConstructor

Lombok還提供了全部參數(shù)的構(gòu)造函數(shù)的自動(dòng)生成旁赊,該注解的作用域也是只有在實(shí)體類上桦踊,因?yàn)橹挥袑?shí)體類才會存在構(gòu)造函數(shù)。修改添加該注解并且測試調(diào)用终畅,如下所示:

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

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

NoArgsConstructor

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

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

Data

我們使用@Data注解就可以涵蓋@ToString绿聘、@Getter嗽上、@Setter方法,當(dāng)然我們使用構(gòu)造函數(shù)時(shí)還是需要單獨(dú)添加注解熄攘,下面我們修改實(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三個(gè)注解注釋掉后添加@Data挪圾,按照官方所說這時(shí)我們的測試類應(yīng)該不會出現(xiàn)任何的異常浅萧,我們打開測試類查看是否正常。
查看后果然哲思,沒有出現(xiàn)任何的異常惯殊,這也說明了@Data注解確實(shí)涵蓋了上面三個(gè)注解。

Slf4j

還有一個(gè)利器也殖,Lombok為我們內(nèi)置了各種日志組件的支持土思,我們在SpringBoot項(xiàng)目開發(fā)中幾乎都是使用logback作為日志組件,而logback是基于slf4j完成的忆嗜。所以我們在實(shí)體類上直接添加@Slf4j就可以自動(dòng)創(chuàng)建一個(gè)日志對象作為類內(nèi)全局字段己儒,自動(dòng)創(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雖然提供的組件不多,但是每一個(gè)都是我們需要的绩卤,正是因?yàn)槿绱藦亩蟠鬁p少了我們的工作量途样,尤其是這種不起眼卻又不得不寫的代碼。Lombok官方文檔地址

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末濒憋,一起剝皮案震驚了整個(gè)濱河市何暇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凛驮,老刑警劉巖裆站,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異黔夭,居然都是意外死亡宏胯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門本姥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肩袍,“玉大人,你說我怎么就攤上這事婚惫》沾停” “怎么了魂爪?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹰祸。 經(jīng)常有香客問我甫窟,道長密浑,這世上最難降的妖魔是什么蛙婴? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮尔破,結(jié)果婚禮上街图,老公的妹妹穿的比我還像新娘。我一直安慰自己懒构,他們只是感情好餐济,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胆剧,像睡著了一般絮姆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秩霍,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天篙悯,我揣著相機(jī)與錄音,去河邊找鬼铃绒。 笑死鸽照,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颠悬。 我是一名探鬼主播矮燎,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赔癌!你這毒婦竟也來了诞外?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灾票,失蹤者是張志新(化名)和其女友劉穎浅乔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铝条,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靖苇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了班缰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贤壁。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖埠忘,靈堂內(nèi)的尸體忽然破棺而出脾拆,到底是詐尸還是另有隱情馒索,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布名船,位于F島的核電站绰上,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏渠驼。R本人自食惡果不足惜蜈块,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迷扇。 院中可真熱鬧百揭,春花似錦、人聲如沸蜓席。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厨内。三九已至祈秕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雏胃,已是汗流浹背请毛。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丑掺,地道東北人获印。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像街州,于是被迫代替她去往敵國和親兼丰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容