简介

大部分项目中都必不可少的包含数据库实体(Entity)、数据载体(dto,dataObject),而这两部分都包含着大量的没有业务逻辑的setter、getter、空参构造,同时我们一般要复写类的toString(),equals(),hashCode()方法(贫血模型)。这些工作都是重复性的工作,作为程序员,懒是必备素质之一,这些工作肯定已经有大牛封装好了处理方法,这就是lombok。

idea 安装插件,支持lombok

lombok是在编译阶段才生成相应的代码体,所以在项目中直接调用setter,getter,constructor会报错,这时候可以在IDE安装相应的插件支持lombok。这里介绍idea插件安装,eclipse请自行百度。

安装方法

  1. 进入设置页面(windows:setting,Mac:Preferences)
  2. 点击Plugin
  3. Browse repositories
  4. 搜索lombok
  5. 点击Install
  6. 安装完毕后开启注解权限才能正常使用: 
    • –>setting
    • –>Build,Execution,Deployment
    • –>Compiler
    • –>Annontation Processors
    • –>勾选Enable annotation processing
    • –> Apply
  7. 重启Idea

引入方法

gradle

// https://mvnrepository.com/artifact/org.projectlombok/lombok
compile group: 'org.projectlombok', name: 'lombok', version: '1.16.16'

maven

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>

常用方法

@Setter

生成setter方法,final变量不包含

//原始类
@Setter
public class TestEntity { private String name; private Integer age; private final String type = "type";
}
//反编译的类
public class TestEntity {
private String name;
private Integer age;
private final String type = "person"; public TestEntity() {
} public void setName(String name) {
this.name = name;
} public void setAge(Integer age) {
this.age = age;
}
}

@Getter

生成getter方法,final变量不包含

//原始类
@Getter
public class TestEntity { private String name; private Integer age; private final String type = "person";
}
//反编译的类
public class TestEntity {
private String name;
private Integer age;
private final String type = "person"; public TestEntity() {
} public String getName() {
return this.name;
} public Integer getAge() {
return this.age;
} public String getType() {
this.getClass();
return "person";
}
}

@NoArgsConstructor

生成空参构造

//原始类
@NoArgsConstructor
public class TestEntity { private String name; private Integer age; private final String type = "person";
}
//反编译的类
public class TestEntity {
private String name;
private Integer age;
private final String type = "person"; public TestEntity() {
}
}

@AllArgsConstructor

生成全部参数构造

//原始类
@AllArgsConstructor
public class TestEntity { private String name; private Integer age; private final String type = "person";
}
//反编译的类
public class TestEntity {
private String name;
private Integer age;
private final String type = "person"; @ConstructorProperties({"name", "age"})
public TestEntity(String name, Integer age) {
this.name = name;
this.age = age;
}
}

@RequiredArgsConstructor

将标记为@NoNull的属性生成一个构造器

如果运行中标记为@NoNull的属性为null,会抛出空指针异常。

//原始类
@RequiredArgsConstructor
public class TestEntity { private String name;
@NonNull
private Integer age; private final String type = "person";
}
//反编译的类
public class TestEntity {
private String name;
@NonNull
private Integer age;
private final String type = "person"; @ConstructorProperties({"age"})
public TestEntity(@NonNull Integer age) {
if(age == null) {
throw new NullPointerException("age");
} else {
this.age = age;
}
}
}

@ToString

生成所有属性的toString()方法

//原始类
@ToString
public class TestEntity { private String name; private Integer age; private final String type = "person";
}
//反编译的类
public class TestEntity {
private String name;
private Integer age;
private final String type = "person"; public TestEntity() {
} public String toString() {
StringBuilder var10000 = (new StringBuilder()).append("TestEntity(name=").append(this.name).append(", age=").append(this.age).append(", type=");
this.getClass();
return var10000.append("person").append(")").toString();
}
}

@EqualsAndHashCode

生成equals()方法和hashCode方法

//原始类
@EqualsAndHashCode
public class TestEntity { private String name; private Integer age; private final String type = "person";
}
//反编译的类
public class TestEntity {
private String name;
private Integer age;
private final String type = "person"; public TestEntity() {
} public boolean equals(Object o) {
if(o == this) {
return true;
} else if(!(o instanceof TestEntity)) {
return false;
} else {
TestEntity other = (TestEntity)o;
if(!other.canEqual(this)) {
return false;
} else {
label47: {
String this$name = this.name;
String other$name = other.name;
if(this$name == null) {
if(other$name == null) {
break label47;
}
} else if(this$name.equals(other$name)) {
break label47;
} return false;
} Integer this$age = this.age;
Integer other$age = other.age;
if(this$age == null) {
if(other$age != null) {
return false;
}
} else if(!this$age.equals(other$age)) {
return false;
} this.getClass();
String this$type = "person";
other.getClass();
String other$type = "person";
if(this$type == null) {
if(other$type != null) {
return false;
}
} else if(!this$type.equals(other$type)) {
return false;
} return true;
}
}
} protected boolean canEqual(Object other) {
return other instanceof TestEntity;
} public int hashCode() {
boolean PRIME = true;
byte result = 1;
String $name = this.name;
int result1 = result * 59 + ($name == null?43:$name.hashCode());
Integer $age = this.age;
result1 = result1 * 59 + ($age == null?43:$age.hashCode());
this.getClass();
String $type = "person";
result1 = result1 * 59 + ($type == null?43:$type.hashCode());
return result1;
}
}

@Data(常用)

@Data直接修饰POJO or beans, getter所有的变量,setter所有不为final的变量。如果你不需要默认的生成方式,直接填写你需要的annotation的就可以了。默认生成的所有的annotation都是public的,如果需要不同权限修饰符可以使用AccessLevel.NONE选项。当然@Data 也可以使用staticConstructor选项生成一个静态方法。

=@Setter+@Getter+@EqualsAndHashCode+@NoArgsConstructor

//原始类
@Data
public class TestEntity {
@Setter(AccessLevel.PRIVATE)
private String name; private Integer age; private final String type = "person";
}
//反编译的类 public class TestEntity {
private String name;
private Integer age;
private final String type = "person"; public TestEntity() {
} public String getName() {
return this.name;
} public Integer getAge() {
return this.age;
} public String getType() {
this.getClass();
return "person";
} public void setAge(Integer age) {
this.age = age;
} public boolean equals(Object o) {
if(o == this) {
return true;
} else if(!(o instanceof TestEntity)) {
return false;
} else {
TestEntity other = (TestEntity)o;
if(!other.canEqual(this)) {
return false;
} else {
label47: {
String this$name = this.getName();
String other$name = other.getName();
if(this$name == null) {
if(other$name == null) {
break label47;
}
} else if(this$name.equals(other$name)) {
break label47;
} return false;
} Integer this$age = this.getAge();
Integer other$age = other.getAge();
if(this$age == null) {
if(other$age != null) {
return false;
}
} else if(!this$age.equals(other$age)) {
return false;
} String this$type = this.getType();
String other$type = other.getType();
if(this$type == null) {
if(other$type != null) {
return false;
}
} else if(!this$type.equals(other$type)) {
return false;
} return true;
}
}
} protected boolean canEqual(Object other) {
return other instanceof TestEntity;
} public int hashCode() {
boolean PRIME = true;
byte result = 1;
String $name = this.getName();
int result1 = result * 59 + ($name == null?43:$name.hashCode());
Integer $age = this.getAge();
result1 = result1 * 59 + ($age == null?43:$age.hashCode());
String $type = this.getType();
result1 = result1 * 59 + ($type == null?43:$type.hashCode());
return result1;
} public String toString() {
return "TestEntity(name=" + this.getName() + ", age=" + this.getAge() + ", type=" + this.getType() + ")";
} private void setName(String name) {
this.name = name;
}
}

@Builder

构造Builder模式的结构。通过内部类Builder()进行构建对象。

//原始类
@Builder
public class TestEntity { private String name; private Integer age; private final String type = "person";
}
//反编译的类
public class TestEntity {
private String name;
private Integer age;
private final String type = "person"; @ConstructorProperties({"name", "age"})
TestEntity(String name, Integer age) {
this.name = name;
this.age = age;
} public static TestEntity.TestEntityBuilder builder() {
return new TestEntity.TestEntityBuilder();
} public static class TestEntityBuilder {
private String name;
private Integer age; TestEntityBuilder() {
} public TestEntity.TestEntityBuilder name(String name) {
this.name = name;
return this;
} public TestEntity.TestEntityBuilder age(Integer age) {
this.age = age;
return this;
} public TestEntity build() {
return new TestEntity(this.name, this.age);
} public String toString() {
return "TestEntity.TestEntityBuilder(name=" + this.name + ", age=" + this.age + ")";
}
}
} //Builder模式使用方法
@Test
public void test(){
TestEntity testEntity = TestEntity.builder()
.name("java")
.age(18)
.build();
}

@Value

与@Data相对应的@Value, 两个annotation的主要区别就是如果变量不加@NonFinal ,@Value会给所有的弄成final的。当然如果是final的话,就没有set方法了。

//原始类
@Value
public class TestEntity {
@Setter(AccessLevel.PRIVATE)
private String name; private Integer age; private final String type = "person";
}
//反编译的类
public final class TestEntity {
private final String name;
private final Integer age;
private final String type = "person"; @ConstructorProperties({"name", "age"})
public TestEntity(String name, Integer age) {
this.name = name;
this.age = age;
} public String getName() {
return this.name;
} public Integer getAge() {
return this.age;
} public String getType() {
this.getClass();
return "person";
} public boolean equals(Object o) {
if(o == this) {
return true;
} else if(!(o instanceof TestEntity)) {
return false;
} else {
TestEntity other;
label44: {
other = (TestEntity)o;
String this$name = this.getName();
String other$name = other.getName();
if(this$name == null) {
if(other$name == null) {
break label44;
}
} else if(this$name.equals(other$name)) {
break label44;
} return false;
} Integer this$age = this.getAge();
Integer other$age = other.getAge();
if(this$age == null) {
if(other$age != null) {
return false;
}
} else if(!this$age.equals(other$age)) {
return false;
} String this$type = this.getType();
String other$type = other.getType();
if(this$type == null) {
if(other$type != null) {
return false;
}
} else if(!this$type.equals(other$type)) {
return false;
} return true;
}
} public int hashCode() {
boolean PRIME = true;
byte result = 1;
String $name = this.getName();
int result1 = result * 59 + ($name == null?43:$name.hashCode());
Integer $age = this.getAge();
result1 = result1 * 59 + ($age == null?43:$age.hashCode());
String $type = this.getType();
result1 = result1 * 59 + ($type == null?43:$type.hashCode());
return result1;
} public String toString() {
return "TestEntity(name=" + this.getName() + ", age=" + this.getAge() + ", type=" + this.getType() + ")";
}
}

@Synchronized

同步方法

//原始类
public class TestEntity {
private String name; private Integer age; private final String type = "person";
@Synchronized
public void write(){
//do something
}
}
//反编译的类
public class TestEntity {
private final Object $lock = new Object[0];
private String name;
private Integer age;
private final String type = "person"; public TestEntity() {
} public void write() {
Object var1 = this.$lock;
synchronized(this.$lock) {
;
}
}
}

@Cleanup @@SneakyThrows

自动调用close方法关闭资源。

//原始类
public class TestEntity {
private String name; private Integer age; private final String type = "person"; @SneakyThrows
public void outputStream(){
@Cleanup OutputStream outputStream = new FileOutputStream(new File("/Users/hello"));
}
}
//反编译的类
public class TestEntity {
private String name;
private Integer age;
private final String type = "person"; public TestEntity() {
} public void outputStream() {
try {
FileOutputStream $ex = new FileOutputStream(new File("/Users/hello"));
if(Collections.singletonList($ex).get(0) != null) {
$ex.close();
} } catch (Throwable var2) {
throw var2;
}
}
}

原文链接:https://blog.csdn.net/u013225178/article/details/80721799

lombok使用及常用注解的更多相关文章

  1. Eclipse安装lombok及常用注解

    转自:https://blog.csdn.net/ZJDWHD/article/details/77795023 lombok的官方网址:http://projectlombok.org/ https ...

  2. eclipse安装lombok和常用注解使用

    1.下载lombok.jar lombok 的官方网址:http://projectlombok.org/   2.运行lombok.jar: java -jar  D:\eclipse-luna\l ...

  3. 20190905 Lombok常用注解

    Lombok常用注解 val 用于声明类型,将从初始化表达式推断出类型,仅适用于局部变量和foreach循环,而不适用于字段.声明的局部变量为final变量. Java自带类型推断随着JDK版本提升越 ...

  4. Lombok 常用注解

    Lombok Lombok 能以简单的注解形式来简化 java 代码,提高开发人员的开发效率.例如开发中经常需要写的 javaBean,都需要花时间去添加相应的 getter/setter,也许还要去 ...

  5. lombok 简化java代码注解

    lombok 简化java代码注解 安装lombok插件 以intellij ide为例 File-->Setting-->Plugins-->搜索"lombok plug ...

  6. Spring Boot常用注解

    SpringBoot注解大全   一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@Enable ...

  7. lombok 中的@Data注解

    今天看到有代码中的Dao包中的类文件,写的极其简洁,甚至引起了开发工具InteliJ的报错,然后程序还能稳健地跑起来. import lombok.Data; @Data public class V ...

  8. Spring系列之Spring常用注解总结

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...

  9. SpringMVC常用注解實例詳解3:@ResponseBody

    我的開發環境框架:        springmvc+spring+freemarker開發工具: springsource-tool-suite-2.9.0JDK版本: 1.6.0_29tomcat ...

随机推荐

  1. [转帖]查看Linux用的桌面是GNOME、KDE或者其他

    http://superuser.com/questions/96151/how-do-i-check-whether-i-am-using-kde-or-gnome KDE 基于QT做的 已经越来越 ...

  2. Jmeter入门(一)干货吐槽

    前言:性能测试的基础是功能测试.性能测试的核心是业务场景,而这个业务场景是从功能测试的场景测试中提取出来的. 所以一个软件的测试顺序是:功能(接口)→性能N(接口)→自动化(接口) 接口测试则分布在每 ...

  3. Python爬虫实战小项目

    爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据 import requests from fake_useragent import UserAgent ua = UserAge ...

  4. Bootstrap3基础教程 02 网格布局

    Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多列. 网页设计中的网格布局作用:组织内容,让网站易于浏览,并降低用户端 ...

  5. C# 使用Emit实现动态AOP框架 进阶篇之异常处理

    目  录 C# 使用Emit实现动态AOP框架 (一) C# 使用Emit实现动态AOP框架 (二) C# 使用Emit实现动态AOP框架 (三) C# 使用Emit实现动态AOP框架 进阶篇之异常处 ...

  6. JS基础_条件分支语句:switch语句

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. kali入侵服务器之后清除痕迹

    Linux清除痕迹 第一种方法: 在退出会话前直接执行: #history -r 清除当前会话的命令历史记录 第二种方法: 在vim中执行自己不想让别人看到的命令随便用vim打开一个文件 :set h ...

  8. centos7配置rsync+inotify数据实时共享

    关于centos7版本上面搭建rsync服务并且实现实时同步之前一直是在6版本上面搭建rsync服务,在7版本上面折腾了半天.此处总结下inotify下载地址:http://github.com/do ...

  9. Spring中常用的设计模式之:代理模式

    看了tom老师讲的深入分析spring源码,讲的挺好,做个小总结 代理模式的定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以 ...

  10. Windows+Nginx+Tomcat整合的安装与配置学习笔记

    以下全部是nginx在window7下运行的: nginx学习总结: 我的是放在F盘 1.启动:F:\nginx-1.10.2\nginx-1.10.2>start nginx.exe(找到相应 ...