lombok
前言
封装是java语言中的三大特性之一,最常见的封装可能就是我们要将实体类中的属性使用private
修饰符进行修饰,然后书写相应的公共访问器(get方法),修改器(set)方法。像这些方法的书写基本都是固定的,有的就是改一下名称啥的。
记得刚开始学的时候很快就厌烦了写这些相同的代码,之后发现了一些集成开发环境中能够通过快捷键自动生成,也减少了一定的代码量的书写。但是到了后面随着编写项目实体类的增加发现这些快捷键按多了也烦了。
lombok这个工具就可以帮助我们解决重复书写这类方法的问题。
实体类封装的代码历程:
手写get和set方法 - IDEA中自动生成 - 使用lombok注解自动生成
简介
Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而使您的Java更加有趣。永远不要再编写另一个getter或equals方法,带有一个注释的类将具有功能齐全的生成器,自动执行日志记录变量等等。-- 摘自官网
意思就是说lombok是通过注解的方式帮助我们在编译期的时候自动生成get和set等方法。
使用lombok步骤如下:
- IDEA中安装对应的lombok插件
路径: Setting-Plugins-lombok
-
Maven工程中导入依赖
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <scope>provided</scope> </dependency> </dependencies>
备注:使用
provided
作用域就行了,因为lombok是在编译时期生效的,后面的注解中可以看到。
使用
lombok的是通过一组注解来替代get,set等模板方法的生成,常用的有如下几个注解:
@Data注解
这个注解可以用来自动生成所有属性的get和set方法,toString方法,equals方法和hashCode方法。使用方式如下所示:
如果不使用@Data注解的话该类的代码行数就变得多了很多。
上述如果类不使用lombok注解的代码:
package cn.net.smrobot.lombok_learn.entity;
import java.util.Objects;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
可见使用lombok方式可以让整个类看起来简洁很多。
其他常用的注解使用方式如下:
注解名称 | 作用 |
---|---|
@Getter | 生成属性的get方法 |
@Setter | 生成属性的set方法 |
@ToString | 按照固定的格式生成toString方法 |
@@EqualsAndHashCode | 生成equals和hashCode方法 |
@NoArgsConstructor | 生成无参构造方法,通常和@AllArgsConstructor一起使用 |
@AllArgsConstructor | 生成所有属性的有参构造方法 |
因此如果要生成所有的这些方法,使用@Data注解就行了(不包括有参构造方法)。
@Accessors
该注解可以将类上的set方法开启链式调用的模式。即set方法中不再是返回void,而是返回该对象。其使用方式如下:
@Data
@Accessors(chain = true)
public class User {
private String name;
private int age;
public static void main(String[] args) {
User user = new User();
user.setName("张三").setAge(20); // 链式调用,简化set的书写
}
}
属性chain=true就会开启链式调用。
其生成的set方法形式如下:
public User setName(String name) {
this.name = name;
return this; // 返回了该对象
}
@Slf4j
该注解会自动在类中生成一个Logger日志对象
@Slf4j
@RestController
public UserController {
// @Slf4j注解可以用来替换这条语句。
//private Logger log = LoogerFactory.getLogger(this.getClass());
}
使用该注解后该类中就有一个名为"log"的Logger对象了。
原理
lombok的注解都是在源代码编译期生效的,例如@Data注解的源码
@Target({ElementType.TYPE})
// SOURCE时期生效
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
String staticConstructor() default "";
}
而lombok就是通过在java的编译器(javac
)将java代码编译成.class字节码文件时,修改了编译形成抽象语法树。
补充
有时候使用lombok并不能一劳永逸,可能在某些场景下也会出错。例如在spring data jpa中使用中间表查询时直接使用@Data注解有时候就会造成查询的死循环。所以在编程过程中出现错误时也可以考虑一下是不是lombok的问题。
但是总的来说lombok使用起来还是很方便的。