Lombok 是 Java 日常开发最常用的库之一——一个 @Data 就省掉几十行 getter/setter/toString。这篇把 Lombok 的核心讲透:它是什么、最常用的注解全家桶、以及它的原理。
一、Lombok 是什么:消灭样板代码
Java 的"样板代码"(boilerplate)特别多——一个普通的数据类要写 getter/setter/toString/equals/hashCode/构造器,几十行全是重复劳动:
// 不用 Lombok:一个 User 类要写一大坨
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 String toString() { return "User{name=" + name + ", age=" + age + "}"; }
// equals/hashCode/构造器... 还有几十行
}// 用 Lombok:一个 @Data 全搞定
@Data
public class User {
private String name;
private int age;
}
// 编译时自动生成:getter/setter/toString/equals/hashCode/全参构造器Lombok 是编译期注解处理器:编译时根据注解,自动把 getter/setter 等方法"生成"进字节码。你源码里只写注解,编译出来的 class 是完整的。
二、最常用注解速查
| 注解 | 生成什么 |
|---|---|
@Getter / @Setter | getter / setter |
@ToString | toString |
@EqualsAndHashCode | equals + hashCode |
@NoArgsConstructor | 无参构造器 |
@RequiredArgsConstructor | 只有 final/@NonNull 字段的构造器 |
@AllArgsConstructor | 全字段构造器 |
@Data | 上面 getter/setter/toString/equals/hashCode 全打包 + 全参构造器 |
@Builder | 建造者模式(见《Lombok @Builder 实战》) |
@Slf4j | 注入 log 日志对象 |
@NonNull | 参数空检查 |
三、@Data:最常用的"全家桶"
@Data 是最常用的注解,一个顶五个:
@Data
public class User {
private String name;
private int age;
}
// 自动生成:getter/setter/toString/equals/hashCode
User user = new User();
user.setName("BinMaker"); // setter
System.out.println(user); // toString
user.equals(other); // equals/hashCode日常的数据模型类(实体、DTO、VO)基本都用 @Data。
四、构造器注解:三个怎么选
| 注解 | 生成的构造器 | 场景 |
|---|---|---|
@NoArgsConstructor | 无参 | MyBatis/Jackson 反序列化需要无参构造 |
@RequiredArgsConstructor | 只含 final/@NonNull 字段 | 配合 final 字段做依赖注入 |
@AllArgsConstructor | 所有字段 | 需要一次性传全部字段 |
经典组合:@Data + @NoArgsConstructor + @AllArgsConstructor——数据模型标配(有全参构造方便创建,无参构造给框架用)。
五、@Slf4j:一行搞定日志
@Slf4j
public class OrderService {
public void pay() {
log.info("开始支付"); // 自动注入了 log 对象,不用手写 LoggerFactory.getLogger(...)
log.error("支付失败", e);
}
}手写日志要 private static final Logger log = LoggerFactory.getLogger(OrderService.class); 一行,@Slf4j 帮你省了。还有 @Log(java.util.logging)、@Log4j2 等变体。
六、原理:编译期注解处理
Lombok 的秘密在于它是个编译期注解处理器(APT,Annotation Processing Tool):
源码(@Data) → 编译时 Lombok 处理器生成方法 → 字节码(完整的方法)配合 IDE 插件(IDEA 装 Lombok 插件),IDE 也能"看到"生成的方法,代码提示、编译都不报错。所以:项目里用 Lombok,IDE 必须装 Lombok 插件,否则 IDE 认为 getName() 不存在,到处飘红。
小结
- Lombok 用注解在编译期生成样板代码,源码极简
- 核心注解:
@Data(全家桶)、构造器三兄弟、@Builder、@Slf4j - 数据模型标配:
@Data+@NoArgsConstructor+@AllArgsConstructor - 原理是编译期注解处理,IDE 需要装 Lombok 插件
@Builder 是最常用也最易踩坑的注解,单独讲一篇《Lombok @Builder 实战》。想了解 @Builder 背后的设计思想,看《建造者模式》。
