SpringBoot 2.x 整合Lombok


Lombok的官方介紹

Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.

Lombok以簡單的注解形式來簡化java代碼,提高開發人員的開發效率

lombok是一個編譯級別的插件,它可以在項目編譯的時候生成一些代碼

1.為IntelliJ IDEA安裝插件

file——>settings——>Plugins

 安裝完后需要重啟IntelliJ IDEA

2.添加依賴

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.61</version>
        </dependency>

    </dependencies>

3.使用

常用注解

@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方法

(1)@Data

@Data 自動生成set/get方法,toString方法,equals方法,hashCode方法,不帶參數的構造方法

實體類

package com.abc.plus.entity;

import lombok.Data;

import java.util.Date;

@Data
public class ApiFiles {
    private Long id;
    private String name;
    private Integer size;
    private Integer status;
    private Date uploadTime;
    private String version;
}

測試

package com.abc.plus.controller;

import com.abc.plus.core.Result;
import com.abc.plus.core.SnowFlake;
import com.abc.plus.entity.ApiFiles;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

@RestController
public class demoController {
    private SnowFlake sn;
    @RequestMapping("/test")
    public Result test(){
        sn = new SnowFlake(1,1);
        ApiFiles file = new ApiFiles();
        file.setId(sn.nextId());
        int r= (int) (Math.random() * 50 + 500);
        file.setName("file"+String.valueOf(r));
        file.setSize(r);
        file.setStatus(1);
        Date currentTime = new Date();
        file.setUploadTime(currentTime);
        return Result.success(200,file);
    }
}

SnowFlake

package com.abc.plus.core;

import com.alibaba.fastjson.JSON;

/**
 * Created by Beibei on 19/02/22
 * API響應結果
 */
public class Result<T> {
    private int code;
    private String message;
    private T data;

    public Result setCode(Integer code) {
        this.code = code;
        return this;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public Result setMessage(String message) {
        this.message = message;
        return this;
    }

    public T getData() {
        return data;
    }

    public Result setData(T data) {
        this.data = data;
        return this;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }

    public static <T>  Result<T> fail(Integer code,T data) {
        Result<T> ret = new Result<T>();
        ret.setCode(code);
        ret.setData(data);
        return ret;
    }

    public static <T>  Result<T> failMessage(Integer code,String msg) {
        Result<T> ret = new Result<T>();
        ret.setCode(code);
        ret.setMessage(msg);
        return ret;
    }
    public static <T>  Result<T> successMessage(Integer code,String msg) {
        Result<T> ret = new Result<T>();
        ret.setCode(code);
        ret.setMessage(msg);
        return ret;
    }

    public static <T> Result<T> success(Integer code,T data) {
        Result<T> ret = new Result<T>();
        ret.setCode(code);
        ret.setData(data);
        return ret;
    }

    public static <T> Result<T> success(Integer code,T data,String msg) {
        Result<T> ret = new Result<T>();
        ret.setCode(code);
        ret.setData(data);
        ret.setMessage(msg);
        return ret;
    }

}
View Code

Result 

package com.abc.plus.core;

public class SnowFlake {
    /**
     * 起始的時間戳
     */
    private final static long START_STMP = 1480166465631L;

    /**
     * 每一部分占用的位數
     */
    private final static long SEQUENCE_BIT = 12; //序列號占用的位數
    private final static long MACHINE_BIT = 5;   //機器標識占用的位數
    private final static long DATACENTER_BIT = 5;//數據中心占用的位數

    /**
     * 每一部分的最大值
     */
    private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);
    private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
    private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);

    /**
     * 每一部分向左的位移
     */
    private final static long MACHINE_LEFT = SEQUENCE_BIT;
    private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
    private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;

    private long datacenterId;  //數據中心
    private long machineId;     //機器標識
    private long sequence = 0L; //序列號
    private long lastStmp = -1L;//上一次時間戳

    public SnowFlake(long datacenterId, long machineId) {
        if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {
            throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");
        }
        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
            throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
        }
        this.datacenterId = datacenterId;
        this.machineId = machineId;
    }

    /**
     * 產生下一個ID
     *
     * @return
     */
    public  long nextId() {
        long currStmp = getNewstmp();
        if (currStmp < lastStmp) {
            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
        }

        if (currStmp == lastStmp) {
            //相同毫秒內,序列號自增
            sequence = (sequence + 1) & MAX_SEQUENCE;
            //同一毫秒的序列數已經達到最大
            if (sequence == 0L) {
                currStmp = getNextMill();
            }
        } else {
            //不同毫秒內,序列號置為0
            sequence = 0L;
        }

        lastStmp = currStmp;

        return (currStmp - START_STMP) << TIMESTMP_LEFT //時間戳部分
                | datacenterId << DATACENTER_LEFT       //數據中心部分
                | machineId << MACHINE_LEFT             //機器標識部分
                | sequence;                             //序列號部分
    }

    private long getNextMill() {
        long mill = getNewstmp();
        while (mill <= lastStmp) {
            mill = getNewstmp();
        }
        return mill;
    }

    private long getNewstmp() {
        return System.currentTimeMillis();
    }
}
View Code

啟動項目

http://localhost:8080/test

返回結果

{
    "code": 200,
    "message": null,
    "data": {
        "id": 400317896322060288,
        "name": "file507",
        "size": 507,
        "status": 1,
        "uploadTime": "2019-12-06T05:21:29.661+0000",
        "version": null
    }
}
(2)@Builder
實體類
package com.abc.plus.entity;

import lombok.Builder;
import lombok.Data;

import java.util.Date;
@Builder
@Data
public class ApiFiles {
    private Long id;
    private String name;
    private Integer size;
    private Integer status;
    private Date uploadTime;
    private String version;
}

測試

package com.abc.plus.controller;

import com.abc.plus.core.Result;
import com.abc.plus.core.SnowFlake;
import com.abc.plus.entity.ApiFiles;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

@RestController
public class demoController {
    private SnowFlake sn;
    @RequestMapping("/test")
    public Result test(){
        sn = new SnowFlake(1,1);
        Long id= sn.nextId();
        int r= (int) (Math.random() * 50 + 500);
        Date currentTime = new Date();
        ApiFiles file = ApiFiles.builder()
                .id(id)
                .name("file"+String.valueOf(r))
                .size(r)
                .status(1)
                .uploadTime(currentTime)
                .build();
        return Result.success(200,file);
    }
}

(3)@NonNull

實體類

package com.abc.plus.entity;

import lombok.Builder;
import lombok.Data;
import lombok.NonNull;

import java.util.Date;
@Builder
@Data
public class ApiFiles {
    private Long id;
    private String name;
    private Integer size;
    private Integer status;
    private Date uploadTime;
    @NonNull
    private String version;
}

用上邊的測試方法測試,沒給version賦值,輸出結果

{
    "timestamp": "2019-12-06T05:40:09.861+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "version is marked non-null but is null",
    "path": "/test"
}
修改為
  ApiFiles file = ApiFiles.builder()
          .id(id)
          .name("file"+String.valueOf(r))
          .size(r)
          .status(1)
          .uploadTime(currentTime)
          .version("11")
          .build();

結果

{
    "code": 200,
    "message": null,
    "data": {
        "id": 400323058746920960,
        "name": "file547",
        "size": 547,
        "status": 1,
        "uploadTime": "2019-12-06T05:42:00.479+0000",
        "version": "11"
    }
}
還有很多,先寫這些了

官網 https://projectlombok.org/

總結:

  Lombok的優點:

    能通過注解的形式自動生成代碼,提高了一定的開發效率;

     讓代碼變得簡潔,簡化了維護工作

不足:

  eclipse或IntelliJ IDEA需要安裝相應的插件;

    不支持多種參數構造器的重載;

    降低了源代碼的可讀性和完整性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM