成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringBoot優(yōu)雅編碼之:Lombok加持

olle / 2400人閱讀

摘要:概述通過提供簡(jiǎn)單的語法注解形式來幫助簡(jiǎn)化消除一些必須有但顯得很臃腫的代碼。作用在方法參數(shù)上的注解,用于自動(dòng)生成空值參數(shù)檢查自動(dòng)幫我們調(diào)用方法。

概述

Lombok 通過提供簡(jiǎn)單的語法注解形式來幫助簡(jiǎn)化消除一些必須有但顯得很臃腫的 java 代碼。典型的是對(duì)于 POJO對(duì)象的簡(jiǎn)化(如自動(dòng)幫我們生成Setter和Getter等),有了Lombok的加持,開發(fā)人員可以免去很多重復(fù)且臃腫的操作,極大地提高java代碼的信噪比,因此我們必須嘗試并應(yīng)用起來!

注: 本文首發(fā)于 My 公眾號(hào) CodeSheep ,可 長(zhǎng)按掃描 下面的 小心心 來訂閱 ↓ ↓ ↓

IntelliJ IDEA上配置

方法一:直接在IDEA界面中配置

首先進(jìn)入Plugins界面:

然后搜索并安裝Lombok插件:

最后不要忘了開啟Annotation Processors的Enable選項(xiàng):

上述安裝完成以后需要重啟IDEA生效!

方法二:手動(dòng)下載Lombok插件安裝

有時(shí)由于網(wǎng)絡(luò)原因,上面方法一這種方式安裝失敗,因此只能手動(dòng)下載安裝

下載lombok插件:

https://github.com/mplushniko...

Plugins -> Install plugin from disk... 選擇下載的zip包安裝

重啟idea即可

IDE中設(shè)置完成以后需要在pom.xml中添加如下所示的lombok依賴才能使用


    org.projectlombok
    lombok
    1.16.16
Lombok主要注解

@Getter and @Setter / 自動(dòng)為屬性提供 Set和Get 方法

@ToString / 該注解的作用是為類自動(dòng)生成toString()方法

@EqualsAndHashCode / 為對(duì)象字段自動(dòng)生成hashCode和equals實(shí)現(xiàn)

@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor / 顧名思義,為類自動(dòng)生成對(duì)應(yīng)參數(shù)的constructor

@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog / 自動(dòng)為類添加對(duì)應(yīng)的log支持

@Data / 自動(dòng)為所有字段添加@ToString, @EqualsAndHashCode, @Getter,為非final字段添加@Setter,和@RequiredArgsConstructor,本質(zhì)上相當(dāng)于幾個(gè)注解的綜合效果

@NonNull / 自動(dòng)幫助我們避免空指針。作用在方法參數(shù)上的注解,用于自動(dòng)生成空值參數(shù)檢查

@Cleanup / 自動(dòng)幫我們調(diào)用close()方法。作用在局部變量上,在作用域結(jié)束時(shí)會(huì)自動(dòng)調(diào)用close方法釋放資源

下文就Lombok中用的最為頻繁的@Data@Log注解進(jìn)行代碼實(shí)戰(zhàn)!

@Data注解使用

官網(wǎng)關(guān)于@Data注解的解釋如下:

All together now: A shortcut for @ToString, @EqualsAndHashCode, @Getter on all fields, @Setter on all non-final fields, and @RequiredArgsConstructor!

不難理解,其可以看成是多個(gè)Lombok注解的集成,因此使用很方便!

先來創(chuàng)建一個(gè)POJO實(shí)體UserLombok,普通的寫法如下:

public class UserLombok {
  private final String name;
  private int age;
  private double score;
  private String[] tags;
  
  public UserLombok(String name) {
    this.name = name;
  }
  
  public String getName() {
    return this.name;
  }
  
  void setAge(int age) {
    this.age = age;
  }
  
  public int getAge() {
    return this.age;
  }
  
  public void setScore(double score) {
    this.score = score;
  }
  
  public double getScore() {
    return this.score;
  }
  
  public String[] getTags() {
    return this.tags;
  }
  
  public void setTags(String[] tags) {
    this.tags = tags;
  }
  
  @Override public String toString() {
    return "DataExample(" + this.getName() + ", " + this.getAge() + ", " + this.getScore() + ", " + Arrays.deepToString(this.getTags()) + “)”;
  }
  
  protected boolean canEqual(Object other) {
    return other instanceof DataExample;
  }
  
  @Override public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof DataExample)) return false;
    DataExample other = (DataExample) o;
    if (!other.canEqual((Object)this)) return false;
    if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
    if (this.getAge() != other.getAge()) return false;
    if (Double.compare(this.getScore(), other.getScore()) != 0) return false;
    if (!Arrays.deepEquals(this.getTags(), other.getTags())) return false;
    return true;
  }
  
  @Override public int hashCode() {
    final int PRIME = 59;
    int result = 1;
    final long temp1 = Double.doubleToLongBits(this.getScore());
    result = (result*PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());
    result = (result*PRIME) + this.getAge();
    result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32));
    result = (result*PRIME) + Arrays.deepHashCode(this.getTags());
    return result;
  }
}

Lombok加持后,寫法可簡(jiǎn)化為:

@Data
public class UserLombok {
    private final String name;
    private int age;
    private double score;
    private String[] tags;
}

在IDEA中使用時(shí),Lombok的注解會(huì)自動(dòng)補(bǔ)全,如下圖所示:

我們來寫POJO的測(cè)試代碼

    public static void main( String[] args ) {
        UserLombok userLombok = new UserLombok("hansonwang99”);
        userLombok.setAge(18);
        String[] array = new String[]{"apple","juice”};
        userLombok.setTags( array );
        userLombok.setScore( 99.0 );
        System.out.println(userLombok);
    }

由下圖我們可以看到IDEA依然可以自動(dòng)為我們補(bǔ)全由Lombok自動(dòng)生成的代碼:

結(jié)果打印

由于Lombok為我們自動(dòng)生成了toString方法,因此對(duì)象的打印結(jié)果如下:

UserLombok(name=hansonwang99, age=18, score=99.0, tags=[apple, juice])
@Log注解實(shí)戰(zhàn)

在我的文章 Spring Boot日志框架實(shí)踐 一文中,我們使用Log4j2來作為日志對(duì)象,其寫法如下:

@RestController
@RequestMapping("/testlogging”)
public class LoggingTestController {

    private final Logger logger = LogManager.getLogger(this.getClass());

    @GetMapping("/hello”)
    public String hello() {
        for(int i=0;i<10_0000;i++){
            logger.info("info execute index method”);
            logger.warn("warn execute index method”);
            logger.error("error execute index method”);

        }

        return "My First SpringBoot Application”;
    }
}

若改用Lombok后,寫法變得更加簡(jiǎn)潔,我們只需要引入對(duì)應(yīng)的@Log注解即可完成log對(duì)象的生成:

@RestController
@RequestMapping("/testloggingwithlombok”)
@Log4j2
public class LoggingTestControllerLombok {

    @GetMapping("/hello”)
    public String hello() {
        for(int i=0;i<10_0000;i++){
            log.info("info execute index method”);
            log.warn("warn execute index method”);
            log.error("error execute index method”);

        }

        return "My First SpringBoot Application”;
    }
}

怎么樣,是不是一切都是那么地優(yōu)雅!

后記

作者更多的原創(chuàng)文章在此,歡迎觀賞

My Personal Blog

作者更多的SpringBt實(shí)踐文章在此:

Spring Boot應(yīng)用監(jiān)控實(shí)戰(zhàn)

SpringBoot應(yīng)用部署于外置Tomcat容器

ElasticSearch搜索引擎在SpringBt中的實(shí)踐

初探Kotlin+SpringBoot聯(lián)合編程

Spring Boot日志框架實(shí)踐

SpringBoot優(yōu)雅編碼之:Lombok加持

如果有興趣,也可以抽點(diǎn)時(shí)間看看作者一些關(guān)于容器化、微服務(wù)化方面的文章:

利用K8S技術(shù)棧打造個(gè)人私有云 連載文章

從一份配置清單詳解Nginx服務(wù)器配置

Docker容器可視化監(jiān)控中心搭建

利用ELK搭建Docker容器化應(yīng)用日志中心

RPC框架實(shí)踐之:Apache Thrift

RPC框架實(shí)踐之:Google gRPC

微服務(wù)調(diào)用鏈追蹤中心搭建

Docker容器跨主機(jī)通信

Docker Swarm集群初探

高效編寫Dockerfile的幾條準(zhǔn)則

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68975.html

相關(guān)文章

  • SpringBoot熱部署加持

    摘要:概述進(jìn)行的開發(fā)過程中,我們很多時(shí)候經(jīng)常需要重啟服務(wù)器才能保證修改的源代碼文件或者一些諸如的配置文件以及一些靜態(tài)文件生效,這樣耗時(shí)又低效。 showImg(https://segmentfault.com/img/remote/1460000015363888); 概述 進(jìn)行SpringBoot的Web開發(fā)過程中,我們很多時(shí)候經(jīng)常需要重啟Web服務(wù)器才能保證修改的 源代碼文件、或者一些...

    ixlei 評(píng)論0 收藏0
  • RPC框架實(shí)踐:Apache Thrift

    摘要:在文章微服務(wù)調(diào)用鏈追蹤中心搭建一文中模擬出來的調(diào)用鏈就是一個(gè)遠(yuǎn)程調(diào)用的例子,只不過這篇文章里是通過這種同步調(diào)用方式,利用的是協(xié)議在應(yīng)用層完成的,這種方法雖然奏效,但有時(shí)效率并不高。 showImg(https://segmentfault.com/img/remote/1460000014858219); 一、概述 RPC(Remote Procedure Call)即 遠(yuǎn)程過程調(diào)...

    Gilbertat 評(píng)論0 收藏0
  • RPC框架實(shí)踐:Apache Thrift

    摘要:在文章微服務(wù)調(diào)用鏈追蹤中心搭建一文中模擬出來的調(diào)用鏈就是一個(gè)遠(yuǎn)程調(diào)用的例子,只不過這篇文章里是通過這種同步調(diào)用方式,利用的是協(xié)議在應(yīng)用層完成的,這種方法雖然奏效,但有時(shí)效率并不高。 showImg(https://segmentfault.com/img/remote/1460000014858219); 一、概述 RPC(Remote Procedure Call)即 遠(yuǎn)程過程調(diào)...

    keithxiaoy 評(píng)論0 收藏0
  • SpringBoot應(yīng)用部署于外置Tomcat容器

    摘要:但考慮到實(shí)際的情形中,我們的服務(wù)器一般是另外部署好了的,有專門的維護(hù)方式。此時(shí)我們需要?jiǎng)冸x掉應(yīng)用內(nèi)置的服務(wù)器,進(jìn)而將應(yīng)用發(fā)布并部署到外置的容器之中,本文就實(shí)踐一下這個(gè)。 showImg(https://segmentfault.com/img/remote/1460000015173574); 0x01. 概述 SpringBoot平時(shí)我們用的爽歪歪,爽到它自己連Tomcat都自集成...

    draveness 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<