1. Lombok 的安装和配置
1.1 Maven 配置
在 pom.xml 中添加 Lombok 依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version> <!-- 请根据实际情况选择版本 -->
<scope>provided</scope>
</dependency>
1.2 Gradle 配置
在 build.gradle 中添加:
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'
}
1.3 IDE 配置
- IntelliJ IDEA:安装 Lombok 插件(Settings -> Plugins -> 搜索 Lombok)。
- Eclipse:安装 Lombok 插件,或者运行 Lombok jar 文件并选择 Eclipse 安装目录。
2. Lombok 常用注解详解
2.1 @Getter / @Setter
自动为字段生成 getter 和 setter 方法。
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private String name;
private int age;
}
也可以只在字段上使用:
@Getter
private String name;
@Setter
private int age;
2.2 @ToString
自动生成 toString() 方法。
import lombok.ToString;
@ToString
public class User {
private String name;
private int age;
}
2.3 @EqualsAndHashCode
自动生成 equals() 和 hashCode() 方法。
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class User {
private String name;
private int age;
}
2.4 @NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor
自动生成无参、全参、必需参数(final 字段或带 @NonNull 字段)的构造方法。
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class User {
private String name;
private int age;
}
2.5 @Data
集成了 @Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor。
import lombok.Data;
@Data
public class User {
private String name;
private int age;
}
2.6 @Builder
实现建造者模式,适用于复杂对象的创建。
import lombok.Builder;
@Builder
public class User {
private String name;
private int age;
}
使用方式:
User user = User.builder().name("Tom").age(18).build();
2.7 @Value
不可变类(final class,所有字段为 private final,只有 getter,无 setter)。
import lombok.Value;
@Value
public class User {
String name;
int age;
}
2.8 @Slf4j
自动为类生成日志对象(private static final org.slf4j.Logger log)。
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class UserService {
public void test() {
log.info("Hello Lombok!");
}
}
3. Lombok 配置文件(lombok.config)
Lombok 支持通过 lombok.config 文件进行个性化配置,放在项目根目录或包目录下。
常用配置项:
# 是否启用 Lombok
lombok.enabled = true
# getter/setter 是否生成为 public
lombok.accessors.chain = true
# 是否在生成的 getter/setter 上添加 @Generated 注解
lombok.addGeneratedAnnotation = true
更多配置项参考官方文档:Lombok Configuration System
4. Lombok 使用注意事项
- Lombok 是编译期工具,对源码进行修改,IDE 必须支持 Lombok,否则会报错。
- Lombok 生成的代码不会直接出现在源码中,而是编译后有效。
- Lombok 可能与部分工具(如 MapStruct)或某些代码检查工具有兼容性问题。
5. Lombok 实用示例
import lombok.Data;
import lombok.Builder;
import lombok.extern.slf4j.Slf4j;
@Data
@Builder
@Slf4j
public class User {
private String name;
private int age;
public void printInfo() {
log.info("User info: {}", this.toString());
}
}
7. Lombok 进阶用法
7.1 @Accessors
自定义 getter/setter 的生成方式。常用于链式调用或自定义前缀。
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true) // 允许链式调用
public class User {
private String name;
private int age;
}
// 用法
User user = new User().setName("Tom").setAge(20);
常用参数:
chain = true:返回 this,实现链式调用。fluent = true:去掉 get/set 前缀,直接用字段名作为方法名。
7.2 @Singular
与 @Builder 配合使用,自动支持集合的单个元素添加。
import lombok.Builder;
import lombok.Singular;
import java.util.List;
@Builder
public class UserGroup {
@Singular
private List<String> users;
}
// 用法
UserGroup group = UserGroup.builder()
.user("Tom")
.user("Jerry")
.build();
7.3 @NonNull
为参数或字段添加非空校验,自动生成判空代码。
import lombok.NonNull;
public class User {
private String name;
public User(@NonNull String name) {
this.name = name;
}
}
7.4 @Cleanup
自动资源释放,类似 try-with-resources。
import lombok.Cleanup;
import java.io.*;
public void readFile(String file) throws IOException {
@Cleanup InputStream in = new FileInputStream(file);
// 使用 in,无需手动关闭
}
7.5 @Synchronized
线程安全的同步方法,避免直接用 synchronized 关键字。
import lombok.Synchronized;
public class Counter {
private int count = 0;
@Synchronized
public void increment() {
count++;
}
}
8. Lombok 与其他框架集成
8.1 Lombok 与 Spring
Lombok 常与 Spring Boot 配合,简化实体类、DTO、VO、Service 等代码。
常见注解组合:@Data、@Builder、@Slf4j。
注意事项:
@RequiredArgsConstructor可与 Spring 的@Autowired配合,自动注入 final 字段。
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
}
8.2 Lombok 与 JPA/Hibernate
- 建议不要在实体类上用
@Data,而是用@Getter、@Setter,以避免equals、hashCode、toString方法引起懒加载问题。 - 构造方法建议使用
@NoArgsConstructor和@AllArgsConstructor,JPA 需要无参构造器。
9. Lombok 常见问题与解决
9.1 Lombok 注解无效/报错
- 检查 IDE 是否安装了 Lombok 插件。
- 检查 Lombok 依赖是否添加且版本兼容。
9.2 Lombok 生成的代码看不到
- Lombok 只在编译期间生成代码,源码中不可见。可通过 IDE 的 “Show Generated Sources” 或反编译 class 文件查看。
9.3 Lombok 与 MapStruct 冲突
- MapStruct 依赖 getter/setter,建议用
@Getter/@Setter,避免只用@Data。
9.4 Lombok 与序列化
- Lombok 生成的构造器、getter/setter 支持序列化,但如有自定义逻辑需手动实现。
10. Lombok 常用组合推荐
| 场景 | 推荐注解组合 |
|---|---|
| DTO/VO | @Data / @Builder |
| 实体类(JPA) | @Getter / @Setter / @NoArgsConstructor |
| Service | @Slf4j / @RequiredArgsConstructor |
| 工具类 | @UtilityClass |
11. Lombok 的优缺点
优点
- 大幅减少样板代码,提高开发效率。
- 代码更简洁、易于维护。
- 支持主流 IDE 和构建工具。
缺点
- 依赖 IDE 插件,部分工具兼容性有限。
- 生成代码不可见,调试时需注意。
- 部分注解(如 @Data)可能引发 equals/hashCode 问题。
12. Lombok 相关资源
13. Lombok 高级实用技巧
13.1 @Value 进阶用法
@Value 用于不可变对象,所有字段自动变为 private final,类自动加 final,只生成 getter,不生成 setter。
import lombok.Value;
@Value
public class Point {
int x;
int y;
}
适用场景:VO、DTO、常量类,线程安全的数据传递对象。
13.2 @Builder.Default
有时候用 @Builder 构建对象时,某些字段希望有默认值,可以用 @Builder.Default。
import lombok.Builder;
@Builder
public class User {
private String name;
@Builder.Default
private int age = 18;
}
注意:默认值必须直接赋值,不能在构造器或初始化块中赋值。
13.3 @SuperBuilder
当类有继承关系时,@Builder 不支持父类字段的构建。@SuperBuilder 解决此问题。
import lombok.experimental.SuperBuilder;
@SuperBuilder
public class Parent {
private String parentField;
}
@SuperBuilder
public class Child extends Parent {
private String childField;
}
// 用法
Child child = Child.builder()
.parentField("p")
.childField("c")
.build();
13.4 @UtilityClass
用于工具类,自动将类设为 final,构造器私有,所有方法为静态。
import lombok.experimental.UtilityClass;
@UtilityClass
public class MathUtils {
public int add(int a, int b) {
return a + b;
}
}
13.5 @Delegate
实现委托模式,把方法委托给某个字段。
import lombok.experimental.Delegate;
public class Printer {
@Delegate
private final PrintStream out = System.out;
// Printer 可以直接调用 PrintStream 的方法
}
14. Lombok 在团队开发中的最佳实践
-
明确注解使用规范
制定 Lombok 注解在项目中的使用规范,避免滥用。如实体类慎用@Data,推荐用@Getter/@Setter。 -
代码审查注意 Lombok 生成方法
代码评审时注意 Lombok 生成的 equals/hashCode/toString 方法,确保不会引发业务或性能问题。 -
IDE/CI 环境统一
确保所有开发成员的 IDE 都安装 Lombok 插件,CI/CD 构建环境也需支持 Lombok。 -
文档注释补充
Lombok 生成的方法没有 Javadoc,重要方法建议手动补充注释。 -
与第三方库兼容性测试
Lombok 有时与 MapStruct、Jackson 等库有兼容性问题,建议提前测试。
15. Lombok 代码可读性建议
- 不要在同一个类上堆砌过多 Lombok 注解,建议拆分使用,提高可读性。
- 对于公共 API 或对外暴露的接口,建议手写关键方法,保证可维护性。
- 对于 equals/hashCode,务必确认业务字段是否合理参与比较。
16. Lombok 常见坑及解决方案
16.1 构造器注入与 @RequiredArgsConstructor
与 Spring 配合时,推荐使用 @RequiredArgsConstructor 进行构造器注入,避免字段未赋值。
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
}
16.2 @Data 引发的懒加载异常
JPA 实体类用 @Data 可能导致懒加载异常,建议只用 @Getter/@Setter。
16.3 Lombok 与序列化冲突
如需自定义序列化逻辑,建议手写构造器、getter/setter。
17. Lombok 的替代方案
- AutoValue:Google 推出的不可变对象生成工具,适合不可变数据类。
- Immutables:支持更复杂的不可变对象建模。
- MapStruct:专注于 Bean 映射,部分功能与 Lombok 重叠。
18. Lombok 未来趋势与社区建议
- Lombok 仍在持续更新,建议关注官方版本升级。
- 未来 Java 可能原生支持部分 Lombok 功能(如 record),可根据项目实际需求选型。

1689

被折叠的 条评论
为什么被折叠?



