外观
Lombok
2026-04-01
版本: 1.18.36 官网: projectlombok.org
Lombok 通过 Java 注解处理器,在编译期自动生成 getter/setter、构造器、equals/hashCode、toString、日志字段等样板代码,大幅减少重复代码。
引入依赖
// build.gradle
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// 测试代码也需要
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
compileOnly+annotationProcessor是标准配法,Lombok 只在编译期生效,不进入运行时 classpath。
核心注解速览
@Data — POJO 万用注解
@Data
public class SysUserVO {
private Long id;
private String username;
private String email;
}
// 等价于自动生成:
// - 所有字段的 getter/setter
// - equals() / hashCode()(基于所有非 transient 字段)
// - toString()
// - 含全部字段的 requiredArgsConstructor(无 final 字段则为无参构造)在 Entity 上慎用 @Data
@Data 生成的 equals/hashCode 基于所有字段,在 JPA / MyBatis-Plus 等 ORM 框架中对有懒加载的实体可能引发意外问题。
Entity 推荐只用 @Getter @Setter @ToString,VO/DTO 随意使用 @Data。
@Getter / @Setter — 精细控制
@Getter
@Setter
public class SysRoleDO {
private Long id;
private String roleName;
// 只读字段:只生成 getter
@Setter(AccessLevel.NONE)
private LocalDateTime createTime;
}@Builder — 流式构建器
@Builder
@Data
public class SendMailParam {
private String to;
private String subject;
private String content;
@Builder.Default
private boolean htmlContent = false; // 带默认值的字段必须用 @Builder.Default
}
// 使用方式
SendMailParam param = SendMailParam.builder()
.to("xxx@example.com")
.subject("通知")
.content("<p>您好</p>")
.htmlContent(true)
.build();继承场景:父类也有字段时,使用
@SuperBuilder代替@Builder。
@RequiredArgsConstructor — 依赖注入
Nebula 框架强制使用构造器注入,@RequiredArgsConstructor 是最简洁的写法:
@Service
@RequiredArgsConstructor // 为所有 final 字段生成构造器
public class SysUserServiceImpl implements ISysUserService {
private final SysUserMapper sysUserMapper;
private final SysRoleService sysRoleService;
private final AuthRpcService authRpcService;
// 不再需要手写 @Autowired 或全参构造器
}@Slf4j — 日志字段
@Slf4j // 自动注入 private static final Logger log = LoggerFactory.getLogger(Xxx.class)
@Service
@RequiredArgsConstructor
public class OrderServiceImpl {
public void createOrder(OrderSaveParam param) {
log.info("[订单创建] 开始处理,param={}", param);
try {
// ...
} catch (Exception e) {
log.error("[订单创建] 失败,param={}", param, e);
throw e;
}
}
}@ToString — 自定义输出
@ToString(exclude = {"password", "privateKey"}) // 排除敏感字段
@Data
public class AuthAccountDO {
private Long id;
private String username;
private String password; // 不会出现在 toString 中
private String privateKey; // 不会出现在 toString 中
}@EqualsAndHashCode
// 父类也有字段时,必须设置 callSuper = true,否则父类字段不参与比较
@Data
@EqualsAndHashCode(callSuper = true)
public class SysUserDO extends BaseEntity {
private String username;
}在 Nebula Entity 中的最佳实践
package com.huida.nebula.system.core.user.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.huida.nebula.boot.mybatis.entity.BaseEntity;
import lombok.*;
@Getter
@Setter
@ToString(callSuper = true)
@TableName("sys_user")
public class SysUserDO extends BaseEntity {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String username;
@ToString.Exclude // 敏感字段不打印
private String password;
private String email;
private Integer status;
}常见问题
| 问题 | 解决方案 |
|---|---|
| IDEA 提示找不到 getter/setter | 安装 Lombok 插件(File → Settings → Plugins → 搜索 Lombok) |
@Builder 字段有默认值但不生效 | 必须配合 @Builder.Default 才能保留初始值 |
继承关系下 equals 不对 | @EqualsAndHashCode(callSuper = true) |
| 子类 Builder 无法访问父类字段 | 改用 @SuperBuilder |
| 编译后 Kotlin / Groovy 看不到方法 | 需配置对应语言的 annotation processor |
