一、Lombok解决的问题
代码冗余。
以前的Java项目中,充斥着太多不友好的代码:POJO getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运而生。
二、使用
1.idea的settings下载安装Lombok插件
点击File-- Settings设置界面,开启 AnnocationProcessors:
开启该项是为了让Lombok注解在编译阶段起到作用。
2.pom中添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version><!--版本号自己选一个就行-->
</dependency>
Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件。
三、支持的注解
POJO类常用注解:
1.@Getter/@Setter:
作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。
package com.kaplan.pojo;
import lombok.*;
import lombok.extern.log4j.Log4j;
@Getter
@Setter
public class TestDemo {
private String name;
private int age ;
private String email;
private String address;
private String password;
@Getter @Setter private boolean funny;
}
2.@ToString:
作用于类,覆盖默认的toString()方法,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。
3.@EqualsAndHashCode:
作用于类,覆盖默认的equals和hashCode
4.@NonNull:
主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。
5.@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:
作用于类上,用于生成构造函数。有staticName、access等属性。
staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。
@NoArgsConstructor:生成无参构造器;
@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;
@AllArgsConstructor:生成全参构造器
6.@Data:
作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
7.@Builder:
作用于类上,将类转变为建造者模式
8.@Log:
作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解:
其他重要注解:
9.@Cleanup:
自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象
编译后的结果:
10.@SneakyThrows:
可以对受检异常进行捕捉并抛出,可以改写上述的main方法如下:
11.@Synchronized:
作用于方法级别,可以替换synchronize关键字或lock锁,用处不大.
12.@Accessors
@Accessors 注解用来配置lombok如何产生和显示getters和setters的方法。
@Accessors有三个属性,分别是fluent,chain,prefix,@Accessors注解既可以注解在类上也可以注解在属性上
1.fluent
fluent为一个布尔值,如果为true生成的get/set方法则没有set/get前缀,默认为false
例如:
@Accessors(flunet = true)
public class MyClass {
@Getter
private int num;
}
生成的get方法为num(),而不是getNum()
2.chain
chain为一个布尔值,如果为true生成的set方法返回this,为false生成的set方法是void类型。默认为false,除非当fluent为true时,chain默认则为true
在entity或dto或vo类上设置@Accessors(chain = true)
可以在编写代码时对对象的set进行链式赋值操作:
3.prefix
prefix为一系列string类型,可以指定前缀,生成get/set方法时会去掉指定的前缀
例如:
@Accessors(prefix = “m”)
public class MyClass {
@Getter
private int mNum;
}
生成的get方法为getNum(),而不是getMNum()
参考:https://www.jianshu.com/p/2543c71a8e45