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

在去北京培訓的時候,講師說到了lombok這個第三方插件包,使用了以後發現,確實是個神奇,避免了編寫不少臃腫的且定式的代碼,雖然現代的IDE都能經過快捷鍵或者右鍵的方式,使用Generate Getters and Setters快速生成setters/getters,但當某一個字段修改或者添加字段時,又須要重複的操做一遍,但使用了lombok以後。一切都是自動的,除了最經常使用的生成setters/getters,還有諸如:自動生成toString方法、equals、·haashcode·等,還能快速生成Builder模式的javabean類,實在是方便。程序猿是很懶的,一切重複的工做都想經過腳本或者自動化工具來完成,因此,使用lombok吧。html

爲什麼要使用Lombok

咱們在開發過程當中,一般都會定義大量的JavaBean,而後經過IDE去生成其屬性的構造器、getter、setter、equals、hashcode、toString方法,當要增長屬性或者對某個屬性進行改變時,好比命名、類型等,都須要從新去生成上面提到的這些方法。這樣重複的勞動沒有任何意義,Lombok裏面的註解能夠輕鬆解決這些問題。java

  • 簡化冗餘的JavaBean代碼,使得實體文件很簡潔。
  • 大大提升JavaBean中方法的執行效率,省去重複的步驟

Lombok簡介

Lombok是一個能夠經過簡單的註解形式來幫助咱們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,經過使用對應的註解,能夠在編譯源碼的時候生成對應的方法。git

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

官網對其解釋爲: spring

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

利用此原理,也可自行編寫一些工做中一些常常使用到的,好比實體類轉Map對象,map對象轉實體類,本來使用Beanutils或者cglib的BeanCopier實現轉換,前者使用的是反射的機制,因此性能相對較差,後者是使用修改字節碼技術,性能在未使用Converter時基本等同於setget方法。但說白了仍是麻煩,畢竟還須要緩存對象等作到複用等。而使用lombok的形式的話,一切都是自動的,性能基本是沒有損失的,因爲對AST不熟悉,以後有時間了能夠進行插件編寫下(去官網提過這個問題,官方回覆說,不太符合lombok的使用場景,⊙﹏⊙‖∣,仍是本身動手,風衣足食吧~)springboot

eclipse 安裝

  1. 下載 lombok.jar 包
  2. 運行lombok.jar包,會自動掃描系統的ide安裝狀況(或者手動指定目錄),點擊Install/Update,便可。

  1. 不運行jar包狀況下,可直接指定eclipse.ini文件,設置javaagent屬性便可(第二種方法最後的效果也是這樣的。):

Lombok使用

添加maven依賴

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

經常使用註解介紹

  1. @Getter / @Setter:能夠做用在類上和屬性上,放在類上,會對全部的非靜態(non-static)屬性生成Getter/Setter方法,放在屬性上,會對該屬性生成Getter/Setter方法。並能夠指定Getter/Setter方法的訪問級別。微信

  2. @EqualsAndHashCode :默認狀況下,會使用全部非瞬態(non-transient)和非靜態(non-static)字段來生成equals和hascode方法,也能夠指定具體使用哪些屬性。 @ToString 生成toString方法,默認狀況下,會輸出類名、全部屬性,屬性會按照順序輸出,以逗號分割。eclipse

  3. @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:無參構造器、部分參數構造器、全參構造器maven

  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");
  }
}

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

老生常談

  • 我的QQ:499452441
  • 微信公衆號:lqdevOps

我的博客:https://blog.lqdev.cn

本文地址:https://blog.lqdev.cn/2018/07/12/springboot/chapter-two/

相關文章
相關標籤/搜索