1. 程式人生 > >SpringBoot 2.x 整合Lombok

SpringBoot 2.x 整合Lombok

簡介

lombok是一個編譯級別的外掛,它可以在專案編譯的時候生成一些程式碼。比如日常開發過程中需要生產大量的JavaBean檔案,每個JavaBean都需要提供大量的getset方法,如果欄位較多且發生變動的話修改起來相對繁瑣,相應的lombok可以通過註解(@getter,@setter)為我們省去手動建立gettersetter方法的麻煩,它能夠在我們編譯原始碼的時候自動幫我們生成gettersetter方法。

即它最終能夠達到的效果是:在原始碼中沒有gettersetter方法,但是在編譯生成的位元組碼檔案中有gettersetter方法。

另外在專案開發階段,一個class

的屬性是一直變化的,今天可能增加一個欄位,明天可能刪除一個欄位。每次變化都需要修改對應的模板程式碼。另外,有的class的欄位超級多,多到一眼看不完。如果加上模板程式碼,更難一眼看出來。更有甚者,由於欄位太多,想要使用builder來建立。手動建立builder和欄位和原來的類夾雜在一起,看起來很凌亂。lombok@Builder即可解決這個問題。

安裝 lombok 外掛

這裡寫圖片描述

添加註解支援

這裡寫圖片描述

新增依賴

buildscript {
    ext {
        springBootVersion = '2.0.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}
"
) } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group = 'com.yanjun' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { compile('org.springframework.boot:spring-boot-starter'
, 'org.springframework.boot:spring-boot-starter-web', ) //新增lombok依賴 compile 'org.projectlombok:lombok:1.18.0' }

常用註解

  • @Data 註解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法
  • @Setter :註解在屬性上;為屬性提供 setting 方法
  • @Setter :註解在屬性上;為屬性提供 getting 方法
  • @Log4j :註解在類上;為類提供一個 屬性名為log 的 log4j 日誌物件
  • @NoArgsConstructor :註解在類上;為類提供一個無參的構造方法
  • @AllArgsConstructor :註解在類上;為類提供一個全參的構造方法
  • @Cleanup : 可以關閉流
  • @Builder : 被註解的類加個構造者模式
  • @Synchronized : 加個同步鎖
  • @SneakyThrows : 等同於try/catch 捕獲異常
  • @NonNull : 如果給引數加個這個註解 引數為null會丟擲空指標異常
  • @Value : 註解和@Data類似,區別在於它會把所有成員變數預設定義為private final修飾,並且不會生成set方法。

@NonNull 判空處理

package com.yanjun.mybatis.bean;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;

@Data
@NoArgsConstructor
public class User {

    public Integer age;

    @NonNull
    public String name;

}

相當於

package com.yanjun.mybatis.bean;

import lombok.NonNull;

public class User {
    public Integer age;
    @NonNull
    public String name;

    public Integer getAge() {
        return this.age;
    }

    @NonNull
    public String getName() {
        return this.name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setName(@NonNull String name) {
        if (name == null) {
            throw new NullPointerException("name is marked @NonNull but is null");
        } else {
            this.name = name;
        }
    }
}

測試

User user = new User();
user.setName(null);

效果

Exception in thread "main" java.lang.NullPointerException: name is marked @NonNull but is null
    at com.yanjun.mybatis.bean.User.setName(User.java:7)
    at com.yanjun.mybatis.LombokApplication.main(LombokApplication.java:15)

@Data 提供 get、set 方法

package com.yanjun.mybatis.bean;

import lombok.Data;

@Data  //自動生成 get、set 方法
public class User {

    Integer id;

    String name;

    Integer age;


    public static void main(String[] args) {
        //測試方法
        User user = new User();
        user.setName("zhaoyanjun");
        user.setAge(20);
        user.setId(1);
    }

}

@Slf4j 日誌列印

package com.yanjun.mybatis.bean;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data  //自動生成 get、set 方法
@Slf4j  //日誌列印
public class User {

    Integer id;

    String name;

    Integer age;

    public static void main(String[] args) {
        User user = new User();
        user.setName("zhaoyanjun");
        user.setAge(20);
        user.setId(1);

        log.info("日誌" + user.toString());

    }
}

@AllArgsConstructor 全引數建構函式

package com.yanjun.mybatis.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data  //自動生成 get、set 方法
@AllArgsConstructor  //自動生成全引數建構函式
@Slf4j   //日誌列印
public class User {

    Integer id;

    String name;

    Integer age;

    public static void main(String[] args) {
        User user = new User(1, "zhaoyanjun", 20);

        log.info("日誌" + user.toString());
    }
}

@ToString 自動生成toString方法

package com.yanjun.mybatis.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;

@Data  //自動生成 get、set 方法
@AllArgsConstructor  //自動生成全引數建構函式
@Slf4j   //日誌列印
@ToString(of = {"id","age"})  //tostring() 方法裡面只打印 id ,name 欄位
public class User {

    Integer id;

    String name;

    Integer age;

    public static void main(String[] args) {
        User user = new User(1, "zhaoyanjun", 20);

        log.info("日誌" + user.toString());
    }
}

toString() 方法排除欄位

//排除欄位
@ToString(exclude = {"name"})   //tostring() 方法中,name 欄位不參與列印

@Value 用於註解final類

@Value 註解和@Data類似,區別在於它會把所有成員變數預設定義為 private final 修飾,並且不會生成set方法。

package com.yanjun.mybatis.bean;
import lombok.Value;

@Value
public class User {

    Integer id = 1;

    String name = "zhaoyanjun";

    Integer age  = 3 ;
}

編譯後的程式碼

public final class User {
    private final Integer id = 1;
    private final String name = "zhaoyanjun";
    private final Integer age = 3;

    public User() {
    }

    public Integer getId() {
        return this.id;
    }

    public String getName() {
        this.getClass();
        return "zhaoyanjun";
    }

    public Integer getAge() {
        return this.age;
    }

    //省略部分程式碼
    ......
}

@Builder : 被註解的類加個構造者模式

import lombok.Builder;

@Builder
public class User {

    public Integer id;

    public String name;

    public Integer age;
}

相當於以下程式碼

package com.yanjun.mybatis.bean;

public class User {
    public Integer id;
    public String name;
    public Integer age;

    User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public static User.UserBuilder builder() {
        return new User.UserBuilder();
    }

    public static class UserBuilder {
        private Integer id;
        private String name;
        private Integer age;

        UserBuilder() {
        }

        public User.UserBuilder id(Integer id) {
            this.id = id;
            return this;
        }

        public User.UserBuilder name(String name) {
            this.name = name;
            return this;
        }

        public User.UserBuilder age(Integer age) {
            this.age = age;
            return this;
        }

        public User build() {
            return new User(this.id, this.name, this.age);
        }

        public String toString() {
            return "User.UserBuilder(id=" + this.id + ", name=" + this.name + ", age=" + this.age + ")";
        }
    }
}

使用

UserBuilder userBuilder = User.builder();
User user = userBuilder
                .age(10)
                .id(1)
                .name("yanjun")
                .build();

System.out.println(": " + userBuilder.toString());

@Synchronized : 加個同步鎖

package com.yanjun.mybatis.bean;

import lombok.Synchronized;

public class User {

    public Integer age;

    public String name;

    //普通方法,相當於物件鎖
    @Synchronized
    int run1() {
        return 1;
    }

    //靜態方法,相當於類鎖
    @Synchronized
    static int run2() {
        return 2;
    }

}

程式碼的效果相當於

public class User {
    private final Object $lock = new Object[0];
    private static final Object $LOCK = new Object[0];
    public Integer age;
    public String name;

    public User() {
    }

    int run1() {
        Object var1 = this.$lock;
        synchronized(this.$lock) {
            return 1;
        }
    }

    static int run2() {
        Object var0 = $LOCK;
        synchronized($LOCK) {
            return 2;
        }
    }
}

個人微訊號:zhaoyanjun125 , 歡迎關注