(1)用途:以注解形式减少了JAVA的冗余代码,特别适合POJO;
(2)安装:maven依赖加入:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
idea中添加lombok插件
(3)简单使用:
e.g.:
@Entity
@DynamicUpdate
@Data
public class ProductCategory {
/**
* 类目id.
*/
@Id
@GeneratedValue
private Integer categoryId;
/**
* 类目名字.
*/
private String categoryName;
/**
* 类目编号.
*/
private Integer categoryType;
public ProductCategory() {
}
public ProductCategory(String categoryName, Integer categoryType) {
this.categoryName = categoryName;
this.categoryType = categoryType;
}
}
@Data注解将在编译时自动生成getter,setter方法,使代码更加简洁,
例如(引自https://segmentfault.com/a/1190000007966713):
import lombok.ToString;
@ToString(exclude="id")
public class ToStringExample {
private int id;
private String name;
private String[] tags;
}
编译后
import java.util.Arrays;
public class ToStringExample {
public String toString() {
return "ToStringExample(name=" + this.name + ", tags=" + Arrays.deepToString(this.tags) + ")";
}
private int id;
private String name;
private String[] tags;
}
从网上查询了解和阅读源码,其一些注解的用途有:
@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
@ToString:写 toString 方法时使用了 Arrays类的 静态方法 deepToString
- exclude 参数:可以指定哪些属性不出现在 toString 方法中, 比如 exclude={"id", "name"}
- doNotUseGetters 参数:当类中有成员变量的 getter 方法时,生成 toString 方法会使用这些 getter 方法
-
includeFieldNames参数:原本是以 fieldName = fieldValue 的格式来生成 toString 方法的,但是将该参数设置为 false 后(默认是 true),就不会显示 fieldName 了,而只是生成 fieldValue
-
callSuper 参数: 若类 A 是类 B 的子类,那么在 A 类重写 toString 时,若把该参数设置为 true,会加入下面这段代码,即也会把父类 B 的 toString 也写入。
@NonNull :检查传入对象是否为 Null,若为null,则抛出NullPointerException异常。
@EqualsAndHashCode: 用在类上,用于生成 equals 和 hashcode 方法。
@Cleanup :该注解可以用来自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源, 自动生成tryfinally这样的代码来关闭流。
@Value :该注解用于修饰类,是@Data的不可变形式, 相当于为成员变量添加final声明, 只提供getter方法, 而不提供setter方法, 然后还有 equals/hashCode/toString方法,以及一个包含所有参数的构造方法。
@builder: 用在类、构造器、方法上,为你提供复杂的builder APIs
@SneakyThrows: 自动抛受检异常, 而无需显式在方法上使用throws语句。
@Synchronized: 用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性 LOCK,而java中的synchronized关键字锁对象是this,锁在this或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁this或者类对象,这可能会导致竞争条件或者其它线程错误。
其它用法,可参见https://segmentfault.com/a/1190000007966713: