目标
- 什么是Lombok
- Lombok的原理
- Lombok的常用注解
- Lombok的安装
- 官网:https://projectlombok.org/
什么是Lombok
官网介绍:
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
Project Lombok是一个java库,它可以自动插入编辑器和构建工具,增强java性能。永远不要再编写另一个getter或equals方法,只要有一个注释,您的类就有一个功能齐全的生成器,自动记录变量等等。
Lombok原理
Java规范:JSR 269(Java Specification Requests)插件化注解处理API(Pluggable Annotation Processing API)
JDK6提供的特性,在 Javac编译期(SOURCE标识)利用注解,在字节码文件中生成get、set等方法
Java编译器执行过程:
安装Lombok
1️⃣在Maven中加入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
2️⃣在IDEA安装插件
File–>Settings–>Plugins(插件)–>Marketplace–>搜索Lombok–>Install–>Apply–>重启IDEA
2️⃣开启Enable annotation processing
- 安装后会弹出
- 如果没有弹出,则安装下面配置。
使用Lombok
引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!-- 或者Spring -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
使用提供注解
@Getter/@Setter
- 为单个成员变量提供
get/set
方法 - 为所有成员变量设置
get/set
方法 - 无法为static设置
get/set
方法,只为final类型设置get方法
1️⃣为单个成员变量提供get/set
方法
2️⃣为所有成员变量设置get/set
方法
- 使用
AccessLevel
枚举类设置生成的Get/Set方法的访问权限。- AccessLevel.PUBLIC:公开【
默认
】 - AccessLevel.MODULE:默认【不写修饰符】
- AccessLevel.PROTECTED:受保护的
- AccessLevel.PACKAGE:包【该包及其子包】
- AccessLevel.PRIVATE:私有的
- AccessLevel.NONE:不生成响应方法
- AccessLevel.PUBLIC:公开【
3️⃣无法为static设置get/set
方法,只为final类型设置get方法
@ToString
ToString只能加在类上,自动生成toString方法,可以使用exclude排除多个字段,of必须包含哪些字段。
- 例:User
- 使用exclude = {“bir”},排除了bir
- 使用of = {“id”, “name”},必须包含id和name
- 输出结果:User(id=null, name=null),
未含有age
。
@EqualsAndHashCode
生成equals方法、canEqual(判断是否属于Car类)、hashCode方法。也可以进行相等比较的排除,指定。
@EqualsAndHashCode(exclude = {"字段1","字段2"},of = {"字段1","字段2"})
@NonNull
可以加在成员变量前,也可以加在方法参数前。用来指定某个字段不能为空。
@NonNull
private String id;
构造器注解
- @NoArgsConstructor:生成没有参数的构造器
- @RequiredArgsConstructor:为需要特殊处理的每个字段生成一个带有1个参数的构造函数
- @AllArgsConstructor:为类中的每个字段生成一个带有1个参数的构造函数
@Data
@Data集合了@Getter、@Setter、@ToString、@EqualsAndHashCode、@NoArgsConstructor
- User类中只有id属性,@Data注解生成了无参构造器、equals、get/set方法、hashCode、toString
@Accessors
使用在类上,用来给类中set方法开启链式调用。chain属性用来指定是否开启set方法链式调用,true开启,false关闭。
- User类
@Data
@Accessors(chain = true)
public class User {
private Integer id;
private String name;
private Double salary;
}
- 编译后生成的User类(部分)
public User setId(final Integer id) {
this.id = id;
return this;
}
public User setName(final String name) {
this.name = name;
return this;
}
@Slf4j
在类上使用,快速给类定义一个日志变量。
原理:使用@Slf4j注解,相当于在类中声明一个日志对象。
- 例:
@Slf4j
@RestController
public class UserController {
@RequestMapping("/findAll")
public String findAll(){
log.info("a");
return "findAll";
}
}
- 编译后的类
@RestController
public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
public UserController() {
}
@RequestMapping({"/findAll"})
public String findAll() {
log.info("a");
return "findAll";
}
}
😆使用
// void info(String var1, Object var2);
log.info("进入{}地方","北京");
@Log
支持Log4j、Slf4j,日志功能,在类上使用,快速给类定义一个日志变量。
原理:使用@Log注解,相当于在类中声明一个日志对象。
private static final Logger log = Logger.getLogger(UserController.class.getName());
@Builder
使用此注解进行对象的构建,函数式编程/链式编程,省去逐行字段set。
原理:@Builder在编译过程中会生成Builder静态内部类,然后会封装被注解类的所有属性。调用builder()方法后返回类型,就是被重新封装的Builder类,再调用build()方法,则会new原类对象将所有属性传入然后返回。
- User类
@Builder
public class User {
private Integer id;
private String name;
}
- 使用
@Test
public void test(){
User user = User.builder().id(1).name("小王").build();
}
- 编译后的User类
public class User {
private Integer id;
private String name;
User(final Integer id, final String name) {
this.id = id;
this.name = name;
}
public static UserBuilder builder() {
return new UserBuilder();
}
public static class UserBuilder {
private Integer id;
private String name;
UserBuilder() {
}
public UserBuilder id(final Integer id) {
this.id = id;
return this;
}
public UserBuilder name(final String name) {
this.name = name;
return this;
}
public User build() {
return new User(this.id, this.name);
}
public String toString() {
return "User.UserBuilder(id=" + this.id + ", name=" + this.name + ")";
}
}
}
val
类似于JS中的val(弱引用类型),在编译阶段确定类型,简化操作。
// java代码
val map = new HashMap<String,String>();
//编译后
HashMap<String, String> map = new HashMap();
@Cleanup
此注解已被JDK1.7新特性 自动资源管理所替代。
位置:可直接写在方法内
作用:对资源流进行清理
原理:自动生成了try-finally结果,finally内判断了是否产生了异常。
- 编译前
public String findAll(HttpServletResponse response) throws IOException {
@Cleanup
ServletOutputStream outputStream = response.getOutputStream();
return "findAll";
}
- 编译后
public String findAll(HttpServletResponse response) throws IOException {
ServletOutputStream outputStream = response.getOutputStream();
String var4;
try {
var4 = "findAll";
} finally {
if (Collections.singletonList(outputStream).get(0) != null) {
outputStream.close();
}
}
return var4;
}
//无返回值编译后的结果
public void findAll(HttpServletResponse response) throws IOException {
ServletOutputStream outputStream = response.getOutputStream();
if (Collections.singletonList(outputStream).get(0) != null) {
outputStream.close();
}
}