一、Lombok简介
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
二、为何要使用Lombok
我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、hashcode、toString、getter、setter、equals方法,当要增加属性或者对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法。这样重复的劳动没有任何意义,Lombok里面的注解可以轻松解决这些问题。
-
简化冗余的JavaBean代码,使得实体文件很简洁。
-
大大提高JavaBean中方法的执行效率,省去重复的步骤
这里简单说下Lombok实现的原理:主要是通过抽象语法树(AST),在编译处理后,匹配到有其注解的类,那么注解编译器就会自动去匹配项目中的注解对应到在Lombok语法树中的注解文件,并经过自动编译匹配来生成对应类中的getter或者setter方法,达到简化代码的目的。
利用此原理,也可自行编写一些工作中一些经常使用到的,比如实体类转Map对象,map对象转实体类,原本使用Beanutils或者cglib的BeanCopier实现转换,前者使用的是反射的机制,所以性能相对较差,后者是使用修改字节码技术,性能在未使用Converter时基本等同于set和get方法。但说白了还是麻烦,毕竟还需要缓存对象等做到复用等。而使用Lombok的形式的话,一切都是自动的,性能基本是没有损失的。
三、IDEA中安装Lombok插件
1、在顶部工具栏中找到File → Settings
2、找到Plugins,点击 “Browse repositories”按钮
3、在搜索框输入Lombok,选择Lombok插件,点击 “Install”按钮进行安装,然后点击 “Close”按钮,最后重启IDEA即可生效
四、添加Lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
五、Lombok的常用注解
-
@Getter/@Setter
-
@ToString
-
@NonNull
-
@NoArgsConstructor/@RequiredArgsConstructor /@AllArgsConstructor
-
@EqualsAndHashCode
-
@Data/@Value
-
@Cleanup
-
@Budilder
-
@SneakyThrows
-
@Synchronized
-
@Log
六、Lombok注解的介绍与使用
1、@Getter/@Setter
该注解使用在类或者成员变量上,如果使用在类上,可以为类中所有非静态成员变量生成对应的get 和 set方法。如果使用在成员变量上,只能为该成员变量生成对应的get 和 set方法。同时还能够为生成的get 和 set方法指定访问修饰符,如果不指定默认为public
1.1、使用在类上(不指定访问修饰符,默认为public)
package com.lombok;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private String username;
private String password;
}
实际上的效果相当于:
package com.lombok;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
1.2、使用在成员变量上,同时指定访问修饰符
package com.lombok;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
public class User {
@Getter
@Setter(AccessLevel.PROTECTED)
private String username;