歡迎光臨
每天分享高質量文章

SpringBoot | 第二章:lombok 介紹及簡單使用

(點選上方公眾號,可快速關註)


來源:oKong ,

blog.lqdev.cn/2018/07/12/springboot/chapter-two/

在去北京培訓的時候,講師說到了lombok這個第三方外掛包,使用了之後發現,確實是個神奇,避免了編寫很多臃腫的且定式的程式碼,雖然現代的IDE都能透過快捷鍵或者右鍵的方式,使用Generate Getters and Setters快速生成setters/getters,但當某一個欄位修改或者新增欄位時,又需要重覆的操作一遍,但使用了lombok之後。一切都是自動的,除了最常用的生成setters/getters,還有諸如:自動生成toString方法、equals、·haashcode·等,還能快速生成Builder樣式的javabean類,實在是方便。程式猿是很懶的,一切重覆的工作都想透過指令碼或者自動化工具來完成,所以,使用lombok吧。

為何要使用Lombok

我們在開發過程中,通常都會定義大量的JavaBean,然後透過IDE去生成其屬性的建構式、getter、setter、equals、hashcode、toString方法,當要增加屬性或者對某個屬性進行改變時,比如命名、型別等,都需要重新去生成上面提到的這些方法。這樣重覆的勞動沒有任何意義,Lombok裡面的註解可以輕鬆解決這些問題。

  • 簡化冗餘的JavaBean程式碼,使得物體檔案很簡潔。

  • 大大提高JavaBean中方法的執行效率,省去重覆的步驟

Lombok簡介

Lombok是一個可以透過簡單的註解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java程式碼的工具,透過使用對應的註解,可以在編譯原始碼的時候生成對應的方法。

官方地址:https://projectlombok.org/ github地址:https://github.com/rzwitserloot/lombok

官網對其解釋為:

這裡簡單說下lombok實現的原理:主要是透過抽象語法樹(AST),在編譯處理後,匹配到有其註解的類,那麼註解編譯器就會自動去匹配專案中的註解對應到在lombok語法樹中的註解檔案,並經過自動編譯匹配來生成對應類中的getter或者setter方法,達到簡化程式碼的目的。

利用此原理,也可自行編寫一些工作中一些經常使用到的,比如物體類轉Map物件,map物件轉物體類,原本使用Beanutils或者cglib的BeanCopier實現轉換,前者使用的是反射的機制,所以效能相對較差,後者是使用修改位元組碼技術,效能在未使用Converter時基本等同於set和get方法。但說白了還是麻煩,畢竟還需要快取物件等做到復用等。而使用lombok的形式的話,一切都是自動的,效能基本是沒有損失的,由於對AST不熟悉,之後有時間了可以進行外掛編寫下(去官網提過這個問題,官方回覆說,不太符合lombok的使用場景,⊙﹏⊙‖∣,還是自己動手,風衣足食吧~)

eclipse 安裝


1. 下載 lombok.jar 包

2. 執行lombok.jar包,會自動掃描系統的ide安裝情況(或者手動指定目錄),點選Install/Update,即可。

 

3. 不執行jar包情況下,可直接指定eclipse.ini檔案,設定javaagent屬性即可(第二種方法最後的效果也是這樣的。):


Lombok使用

新增maven依賴

    org.projectlombok

    lombok

    1.16.20

常用註解介紹

  1. @Getter / @Setter:可以作用在類上和屬性上,放在類上,會對所有的非靜態(non-static)屬性生成Getter/Setter方法,放在屬性上,會對該屬性生成Getter/Setter方法。並可以指定Getter/Setter方法的訪問級別。

  2. @EqualsAndHashCode :預設情況下,會使用所有非瞬態(non-transient)和非靜態(non-static)欄位來生成equals和hascode方法,也可以指定具體使用哪些屬性。 @ToString 生成toString方法,預設情況下,會輸出類名、所有屬性,屬性會按照順序輸出,以逗號分割。

  3. @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:無參建構式、部分引數建構式、全參建構式

  4. ** @Data:包含@ToString, @EqualsAndHashCode, 所有屬性的@Getter, 所有non-final屬性的@Setter和@RequiredArgsConstructor的組合,通常情況下,基本上使用這個註解就足夠了。**

  5. @Budilder:可以進行Builder方式初始化。

  6. @Slf4j:等同於:private final Logger logger = LoggerFactory.getLogger(XXX.class);簡直不能更爽了!一般上用在其他java類上

更多註解說明,可檢視:https://projectlombok.org/features/index.html

簡單使用示例

使用lombok

@Data

@Builder

@NoArgsConstructor

@AllArgsConstructor

public class Demo {

    String code;

    String name; 

}

等同於

public class Demo {

        String code;

        String name;

 

        public static DemoBuilder builder() {

            return new DemoBuilder();

        }

 

        public String getCode() {

            return this.code;

        }

 

        public String getName() {

            return this.name;

        }

 

        public void setCode(String code) {

            this.code = code;

        }

 

        public void setName(String name) {

            this.name = name;

        }

 

        public boolean equals(Object o) {

            if (o == this)

                return true;

            if (!(o instanceof Demo))

                return false;

            Demo other = (Demo) o;

            if (!other.canEqual(this))

                return false;

            Object this$code = getCode();

            Object other$code = other.getCode();

            if (this$code == null ? other$code != null : !this$code.equals(other$code))

                return false;

            Object this$name = getName();

            Object other$name = other.getName();

            return this$name == null ? other$name == null : this$name.equals(other$name);

        }

 

        protected boolean canEqual(Object other) {

            return other instanceof Demo;

        }

 

        public int hashCode() {

            int PRIME = 59;

            int result = 1;

            Object $code = getCode();

            result = result * 59 + ($code == null ? 43 : $code.hashCode());

            Object $name = getName();

            return result * 59 + ($name == null ? 43 : $name.hashCode());

        }

 

        public String toString() {

            return “Demo(code=” + getCode() + “, name=” + getName() + “)”;

        }

 

        public Demo() {

        }

 

        public Demo(String code, String name) {

            this.code = code;

            this.name = name;

        }

 

        public static class DemoBuilder {

            private String code;

            private String name;

 

            public DemoBuilder code(String code) {

                this.code = code;

                return this;

            }

 

            public DemoBuilder name(String name) {

                this.name = name;

                return this;

            }

 

            public Demo build() {

                return new Demo(this.code, this.name);

            }

 

            public String toString() {

                return “Demo.DemoBuilder(code=” + this.code + “, name=” + this.name + “)”;

            }

        }

    }

使用@Slf4j(摘抄至官網)

@Slf4j

public class LogExampleOther {

 

  public static void main(String… args) {

    log.error(“Something else is wrong here”);

  }

}

常規的

public class LogExampleOther {

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

 

  public static void main(String… args) {

    log.error(“Something else is wrong here”);

  }

}

省了多少事!!!少年快使用吧!

系列

【關於投稿】


如果大家有原創好文投稿,請直接給公號傳送留言。


① 留言格式:
【投稿】+《 文章標題》+ 文章連結

② 示例:
【投稿】《不要自稱是程式員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/

③ 最後請附上您的個人簡介哈~



看完本文有收穫?請轉發分享給更多人

關註「ImportNew」,提升Java技能

贊(0)

分享創造快樂