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

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

启动项目

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需要安装相应的插件;

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

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

SpringBoot 2.x 整合Lombok的更多相关文章

  1. 基于SpringBoot从零构建博客网站 - 整合lombok和mybatis-plus提高开发效率

    在上一章节中<技术选型和整合开发环境>,确定了开发的技术,但是如果直接这样用的话,可能开发效率会不高,为了提高开发的效率,这里再整合lombok和mybatis-plus两个组件. 1.l ...

  2. springboot + mybatis + mycat整合

    1.mycat服务 搭建mycat服务并启动,windows安装参照. 系列文章: [Mycat 简介] [Mycat 配置文件server.xml] [Mycat 配置文件schema.xml] [ ...

  3. SpringBoot+Mybatis+MybatisPlus整合实现基本的CRUD操作

    SpringBoot+Mybatis+MybatisPlus整合实现基本的CRUD操作 1> 数据准备 -- 创建测试表 CREATE TABLE `tb_user` ( `id` ) NOT ...

  4. 从零开始的SpringBoot项目 ( 六 ) 整合 MybatisPlus 实现代码自动生成

    1.添加依赖 <!-- MySQL数据库 --> <dependency> <groupId>mysql</groupId> <artifactI ...

  5. SpringBoot与Mybatis整合方式01(源码分析)

    前言:入职新公司,SpringBoot和Mybatis都被封装了一次,光用而不知道原理实在受不了,于是开始恶补源码,由于刚开始比较浅,存属娱乐,大神勿喷. 就如网上的流传的SpringBoot与Myb ...

  6. Springboot security cas整合方案-实践篇

    承接前文Springboot security cas整合方案-原理篇,请在理解原理的情况下再查看实践篇 maven环境 <dependency> <groupId>org.s ...

  7. Springboot security cas整合方案-原理篇

    前言:网络中关于Spring security整合cas的方案有很多例,对于Springboot security整合cas方案则比较少,且有些仿制下来运行也有些错误,所以博主在此篇详细的分析cas原 ...

  8. 使用Springboot + Gradle快速整合Mybatis-Plus

    使用Springboot + Gradle快速整合Mybatis-Plus 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] MyBatis-Plus(简称 MP)是一个 MyBatis ...

  9. springboot 与 shiro 整合 (简洁版)

    前言: 网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助. 有些朋友比较省事, 直接转发或者复制粘贴.但是没有经过 ...

随机推荐

  1. DVWA-文件上传学习笔记

    DVWA-文件上传学习笔记 一.文件上传漏洞 文件上传漏洞,通常是由于对上传文件的类型.内容没有进行严格的过滤.检查,导致攻击者恶意上传木马以便获得服务器的webshell权限. 二.DVWA学习 将 ...

  2. vue入门案例

    1.技术在迭代,有时候你为了生活没有办法,必须掌握一些新的技术,可能你不会或者没有时间造轮子,那么就先把利用轮子吧. <!DOCTYPE html> <html> <he ...

  3. sqlserver the name is not a valid identifier error in function

    参考资料:https://stackoverflow.com/questions/22008859/the-name-is-not-a-valid-identifier-error-in-functi ...

  4. mvc后台传到前台的值带html标签css(解决方法)

    mvc后台传到前台的值带html标签css MVC中要用:@Html.Raw(后台数据库取的值); 或者MvcHtmlString.create();

  5. CSS box-sizing属性的正确用法

    CSS自定义属性(变量) CSS box-sizing属性允许我们在元素的总宽度和高度中包含填充和边框. 没有CSS box-sizing属性 默认情况下,元素的宽度和高度计算如下: width + ...

  6. APP弱网测试方法

    常用工具 •利用抓包工具   -Fiddler/Charles•使用chrome浏览器的开发者工具•使用手机自带的限速功能(只适用IOS设备)•需要硬件设备(路由器或者网卡)   -NEWT/ATC/ ...

  7. 【分布式搜索引擎】Elasticsearch之安装Elasticsearch可视化平台Kibana

    一.Kibana简单介绍 Kibana 是为 Elasticsearch设计的开源分析和可视化平台.你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互.你 ...

  8. rhel7学习第一天

    今天是在线学习刘遄老师<Linux就该这么学>的第一天,对Linux的发展和优越性有了进一步的了解.

  9. 关于宝塔一个站点绑定多个域名宝塔ssl证书的问题

    目前“宝塔SSL”自动申请绑定一个证书,即根域名和www域名,如果还需要绑定手机端m则需要绑定多个域名如果多域名绑定一个网站数据,需要新建多个站点指向同一文件目录. 用相同的方法,在不新建站点的前提下 ...

  10. 用户交互Scanner的用法

    Java用户交互的目的是实现程序与人的交互:一般通过Scanner来获取用户的输入:java.util.Scanner 是Java5的新特征. 基本语法: Scanner s=new Scanner( ...