@Lombok有啥牛皮的?SpringBoot和IDEA官方都要支持它!
https://www.jianshu.com/p/2543c71a8e45
官方文档:https://projectlombok.org/features/all
IDEA 2020最后一个版本已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置了Lombok依赖。
使用后 getter/setter/toString;异常处理;I/O流的关闭操作等等,只需要一个注释就可以搞定
1、maven <!--lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <scope>provided</scope> </dependency>
SpringBoot 2.1.x版本后无需指定Lombok版本,SpringBoot在spring-boot-dependencies
中已经内置。
2、Lombok注解的使用
使用val注解可以取代任意类型作为局部变量,这样我们就不用写复杂的ArrayList和Map.Entry类型了,具体例子如下。
//val代替ArrayList<String>和String类型
val example = new ArrayList<String>();
//val代替Map.Entry<Integer,String>类型
val map = new HashMap<Integer, String>();
当我们使用了val注解后,Lombok会从局部变量的初始化表达式推断出具体类型
在方法上使用@NonNull注解可以做非空判断,如果传入空值的话会直接抛出NullPointerException。
public NonNullExample(@NonNull String name){
this.name = name;
}
编译后会在构造器中添加非空判断
当我们在Java中使用资源时,不可避免地需要在使用后关闭资源。使用@Cleanup注解可以自动关闭资源。
//使用输入输出流自动关闭,无需编写try catch和调用close()方法
@Cleanup ByteArrayInputStream in = new ByteArrayInputStream(inStr.getBytes("UTF-8"));
@Cleanup ByteArrayOutputStream out = new ByteArrayOutputStream();
有了@Getter/@Setter注解,我们再也不用编写getter/setter方法了。
@Getter
@Setter
private String name;
@Getter
@Setter(AccessLevel.PROTECTED)
private Integer age;
@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。
当我们获取某一个属性比较消耗资源时,可以给@Getter添加lazy=true
属性实现懒加载,会生成Double Check Lock 样板代码对属性进行懒加载。
把所有类属性都编写到toString方法中方便打印日志,是一件多么枯燥无味的事情。使用@ToString注解可以自动生成toString方法,默认会包含所有类属性,使用@ToString.Exclude注解可以排除属性的生成,该属性不在tostring中显示。可以通过of属性限定显示某些字段。
@ToString
public class ToStringExample {
@ToString.Exclude
private Long id;
private String name;
.....
}
使用@EqualsAndHashCode注解作用于类可以自动生成hashCode和equals方法,默认包含所有类属性,使用@EqualsAndHashCode.Exclude可以排除属性的生成。
自动生成构造方法,有三个注解可以使用。
@NoArgsConstructor:生成无参构造函数。
@RequiredArgsConstructor:生成包含必须参数的构造函数,使用@NonNull注解的类属性为必须参数。有@NonNull注解的类属性,的构造器
@AllArgsConstructor:生成包含所有参数的构造函数。
有staticName、access等属性,staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。
@NoArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor
public class ConstructorExample {...}
@Data:作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
@Builder:作用于类上,将类转变为建造者模式
@Log:作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解:
其他重要注解:
@Cleanup:自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象
@Value:使用@Value注解可以把类声明为不可变的,声明后此类相当于final类,无法被继承,其属性也会变成final属性。
@SneakyThrows:自动实现捕获并抛出异常,用在方法前,相当于对方法中的代码块实行了try-catch操作,可以指定异常类
@Synchronized:作用于方法级别,可以替换synchronize关键字或lock锁,用处不大.
使用@With注解可以实现对原对象进行克隆,并改变其一个属性。即,生成一个改变了其中一个属性的新对象。
使用时需要指定全参构造方法,@AllArgsConstructor
@With
@AllArgsConstructor
public class WithExample {
private Long id;
private String name;
private Integer age;
public static void main(String[] args) {
WithExample example1 = new WithExample(1L, "test", 20);
WithExample example2 = example1.withAge(22);
//将原对象进行clone并设置age,返回false
System.out.println(example1.equals(example2));
}
}
使用@Log注解在类上,可以直接生成日志对象log,通过log对象可以直接打印日志。
使用Lombok生成日志对象时,根据使用日志实现的不同,有多种注解可以使用。比如@Log、@Log4j、@Log4j2、@Slf4j等。