# Lombok

我们在写 Java Bean 的时候,需要编写或生成 getter 和 setter 非常的麻烦,Lombok 就是来解决这个麻烦的。

Lombok 是一个 Java 库,在编译代码的时候,它通过注解自动生成常见的代码结构,如构造器、getter、setter、equals、hashCode、toString 等,从而提高开发效率并使代码更加简洁和易读。

下面介绍一下 Lombok 的使用和常用的注解。


# 1 Lombok的使用

# 1.1 首先引入依赖

非 SpringBoot 的项目,在 pom.xml 中引入依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.42</version>
</dependency>
1
2
3
4
5

引入完成,右键 Maven --> Reload project,重新加载一下项目的依赖。


在SpringBoot的项目中,在 pom.xml 中引入依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
1
2
3
4
5

# 1.2 安装插件

如果IDEA版本在2020.3以上,不需要安装Lombok插件。

如果IDEA 版本在2020.3以下,需要安装Lombok插件,点击 Flie --> Setting --> Plugins --> 搜索Lombok --> 安装。


# 1.3 启用注解处理

打开 IDEA 配置,找到 Annotation Processors(可以直接搜索annotation),勾选 Enable annotation processing 。当勾选此选项后,IntelliJ IDEA 会在编译时调用 Lombok 的注解处理器。


# 2 Lombok常用注解

# 2.1 @Getter和@Setter

类上方的 @Getter@Setter 注解会自动为类的属性添加 getter 和 setter 。

import lombok.Getter;
import lombok.Setter;

// 给所有属性添加getter和setter
@Getter 
@Setter
public class User { 
    @Setter  // 给指定的属性添加setter
    private String id;
    @Setter(AccessLevel.PRIVATE)  // 设置setter为私有
    private String name;
    @Getter(AccessLevel.NONE)  // 取消password的getter方法
    private int password;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

可以在类上添加为所有的属性添加 getter 和 setter,也可以为指定的属性添加。


# 2.2 @ToString

自动生成 toString 方法。

import lombok.ToString;

@ToString
public class User {
    private String id;
    private String name;
    private int age;
}
1
2
3
4
5
6
7
8

还可以排除指定的属性:

import lombok.ToString;

@ToString(exclude = {"password"})
public class User {
    private String id;
    private String name;
    private int age;
}
1
2
3
4
5
6
7
8

# 2.3 @EqualsAndHashCode

自动生成 equalshashCode 方法。

import lombok.EqualsAndHashCode;

@EqualsAndHashCode
public class User {
    private String id;
    private String name;
    private int age;
}
1
2
3
4
5
6
7
8

# 2.4 @NonNull

可以添加在属性上,表示使用构造方法或setter给属性赋值时不能为null。

可以添加在方法参数上,传递参数不能为null。

可以添加在方法上,表示返回值不能为null。

import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;

@Setter
@Getter
public class User {
    // 调用构造方法或setter赋值时,值不能为null
    @NonNull
    private String id;
    private String username;
    private String password;

    @NonNull  // 方法返回值不能为null
    public void sing(@NonNull String song) {  // 调用sing方法时,song参数不能为null
        System.out.println("我唱:" + song);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 2.5 构造方法注解

@NoArgsConstructor, @RequiredArgsConstructor@AllArgsConstructor 注解用于自动生成构造器。

  • @NoArgsConstructor 生成无参构造器;
  • @RequiredArgsConstructor 生成包含所有 final 字段和带有 @NonNull 注解的字段的构造器;
  • @AllArgsConstructor 生成包含所有字段的构造器;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String id;
    private String name;
    private String password;
}
1
2
3
4
5
6
7
8
9
10

# 2.6 @Data(最常用)

综合了 @Getter@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor,为类提供全面的功能。

import lombok.Data;

@Data
public class User {
    private String name;
    private int age;
}
1
2
3
4
5
6
7

一般都会在 Bean 上添加该注解,包括与数据库表映射的实体类上。


# 2.7 @Slf4j(最常用)

自动生成日志记录器字段,支持不同的日志框架(如 SLF4J、Log4j、Logback)。

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class User {
    public void doSomething() {
        log.info("Doing something");  // 然后就可以直接使用log了
    }
}
1
2
3
4
5
6
7
8

可以在Controller、Service 等组件上添加,用来打印日志,非常方便。


# 2.8 @Cleanup

@Cleanup 是 Lombok 提供的一个注解,用于简化资源的管理和清理。它确保在方法或代码块执行完毕后,自动调用指定资源的 close() 方法,从而避免资源泄漏。@Cleanup 特别适用于需要显式关闭的资源,如 I/O 流、数据库连接等。

import lombok.Cleanup;
import java.io.*;

public class FileProcessor {
    public void readFile(String path) throws IOException {
        @Cleanup InputStream in = new FileInputStream(path);
        @Cleanup OutputStream out = new FileOutputStream("output.txt");
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = in.read(buffer)) != -1) {
            out.write(buffer, 0, bytesRead);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在这个示例中,@Cleanup 确保 inoutreadFile 方法执行完毕后会自动调用它们的 close() 方法。

Lombok 在编译时会生成资源管理的代码。例如,对于上面的 readFile 方法,Lombok 会生成如下的代码:

public void readFile(String path) throws IOException {
    InputStream in = new FileInputStream(path);
    try {
        OutputStream out = new FileOutputStream("output.txt");
        try {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        } finally {
            if (out != null) {
                out.close();
            }
        }
    } finally {
        if (in != null) {
            in.close();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21