zoukankan      html  css  js  c++  java
  • 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需要安装相应的插件;

        不支持多种参数构造器的重载;

        降低了源代码的可读性和完整性

  • 相关阅读:
    面试官是如何筛选简历?
    成为一名架构师得学习哪些知识?
    一个对话让你明白架构师是做什么的?
    教你一招用 IDE 编程提升效率的骚操作!
    80个让你笑爆肚皮的程序员段子,不好笑算我输!
    Java初学者最佳的学习方法以及会遇到的坑(内含学习资料)!
    作为程序员的你,一年看几本技术相关的书
    MEF 插件式开发之 DotNetCore 中强大的 DI
    MEF 插件式开发之 DotNetCore 初体验
    读 《CSharp Coding Guidelines》有感
  • 原文地址:https://www.cnblogs.com/baby123/p/11994809.html
Copyright © 2011-2022 走看看