Lombok是什么
Lombok是一个java库,它自动插入到编辑器和构建工具中,增强java的性能。不要再编写另一个getter或equals方法,使用一个注释,您的类有一个功能齐全的生成器,自动记录变量等等。简而言之,使用Lombok可以极大减轻编码工作量。
官网地址:https://projectlombok.org
GitHub地址:https://github.com/rzwitserloot/lombok
Lombok安装
IDEA Lombok插件安装
在IDEA插件中心,查找Lombok,Install之后重启IDEA。
插件安装路径:File->Settings->Plugins->Marketplace
项目引入依赖
我们以Spring Boot快速搭建中spring-boot-initializr-maven为例,添加Lombok依赖
<?xml version="1.0" encoding="UTF-8"?> 4.0.0 com.itlife spring-boot-initializr-maven 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASE 1.8 1.16.18 org.springframework.boot spring-boot-starter-web org.projectlombok lombok ${lombok.version}
Lombok使用与测试
创建User实体类
package com.itlife.initializr.maven.entity;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;/*** @author zhongsy* @date 2020/3/27*/@Data@AllArgsConstructor@NoArgsConstructorpublic class User { /** * 用户Id */ private Long id; /** * 用户名称 */ private String name;}
- @Data:相当于以下四个集合* @see Getter 自动生成Getter方法
* @see Setter 自动生成Setter
* @see RequiredArgsConstructor
* @see ToString 自动生成toString()方法,默认情况,按顺序(以“,”分隔)打印你的类名称以及每个字段。
* @see EqualsAndHashCode - @AllArgsConstructor 自动生成一个包含所有变量的构造方法
- @NoArgsConstructor 自动生成一个无参构造方法
创建UserController测试类
package com.itlife.initializr.maven.controller;import com.itlife.initializr.maven.entity.User;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;/*** @author zhongsy* @date 2020/3/27*/@RestController@Slf4j@RequestMapping("user")public class UserController { @GetMapping("hello") public String hello(User user) { log.info("收到用户信息 {}", user); return "hi, " + user + "!"; }}
- @Slf4j:产生一个logger field,相当于private static final Logger log = LoggerFactory.getLogger(UserController.class);
启动Spring Boot测试
- 在浏览器输入测试地址 http://localhost:8080/user/hello?id=1&name=itLife,如果返回hi, User(id=1, name=itLife)!,表明使用成功
修改User实体类
package com.itlife.initializr.maven.entity;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;/*** @author zhongsy* @date 2020/3/27*/@Data@AllArgsConstructor@NoArgsConstructor@ToStringpublic class User { /** * 用户Id */ private Long id; /** * 用户名称 */ private String name; /** * 测试重新toString与Lombok注解冲突 */ @Override public String toString() { return "User By Test {" + "id=" + id + ", name='" + name + ''' + '}'; }}
再次启动Spring Boot测试
- 在浏览器输入测试地址 http://localhost:8080/user/hello?id=1&name=itLife,如果返回hi, User(id=1, name=itLife)!,表明使用成功
通过测试,如果Lombok与用户所写代码有重复的话,以用户代码为准
Lombok原理解析
反编译User.class
Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.itlife.initializr.maven.entity;import java.beans.ConstructorProperties;public class User { private Long id; private String name; public Long getId() { return this.id; } public String getName() { return this.name; } public void setId(final Long id) { this.id = id; } public void setName(final String name) { this.name = name; } public boolean equals(final Object o) { if (o == this) { return true; } else if (!(o instanceof User)) { return false; } else { User other = (User)o; if (!other.canEqual(this)) { return false; } else { Object this$id = this.getId(); Object other$id = other.getId(); if (this$id == null) { if (other$id != null) { return false; } } else if (!this$id.equals(other$id)) { return false; } Object this$name = this.getName(); Object other$name = other.getName(); if (this$name == null) { if (other$name != null) { return false; } } else if (!this$name.equals(other$name)) { return false; } return true; } } } protected boolean canEqual(final Object other) { return other instanceof User; } public int hashCode() { int PRIME = true; int result = 1; Object $id = this.getId(); int result = result * 59 + ($id == null ? 43 : $id.hashCode()); Object $name = this.getName(); result = result * 59 + ($name == null ? 43 : $name.hashCode()); return result; } public String toString() { return "User(id=" + this.getId() + ", name=" + this.getName() + ")"; } @ConstructorProperties({"id", "name"}) public User(final Long id, final String name) { this.id = id; this.name = name; } public User() { }}
反编译UserController.class
Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.itlife.initializr.maven.controller;import com.itlife.initializr.maven.entity.User;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping({"user"})public class UserController { private static final Logger log = LoggerFactory.getLogger(UserController.class); public UserController() { } @GetMapping({"hello"}) public String hello(User user) { log.info("收到用户信息 {}", user); return "hi, " + user + "!"; }}
工作原理说明
通过反编译即可知道,Lombok在生成class文件的时候,会根据注解进行代码生成相应代码,使得我们代码更加简洁。其核心之处就是对于注解的解析上。JDK5引入了注解的同时,也提供了两种解析方式。分别是运行时解析和编译时解析两种。具体如何实现,可以自行查阅官网或者进行源码阅读。
总结
优点
- Lombok最大的好处就在于通过注解的形式来简化Java代码。减少大量的模板代码,一定程度提高代码可读性,可以专注于查看类的属性。
缺点
- 环境配置,需要集成开发工具IDEA、Eclipse之类支持
- 一旦项目中有人使用Lombok插件,会导致其他人也必须安装
使用建议
项目中除非是老项目,不然建议使用。新的项目,建议采用。使用Lombok可以极大减少代码量,更加专注于查看类的属性。如果对于有特殊性要求,可以在使用Lombok的同时自行写相应的方法。