Skip to content

Lombok 是 Java 日常开发最常用的库之一——一个 @Data 就省掉几十行 getter/setter/toString。这篇把 Lombok 的核心讲透:它是什么、最常用的注解全家桶、以及它的原理。

一、Lombok 是什么:消灭样板代码

Java 的"样板代码"(boilerplate)特别多——一个普通的数据类要写 getter/setter/toString/equals/hashCode/构造器,几十行全是重复劳动:

java
// 不用 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/构造器... 还有几十行
}
java
// 用 Lombok:一个 @Data 全搞定
@Data
public class User {
    private String name;
    private int age;
}
// 编译时自动生成:getter/setter/toString/equals/hashCode/全参构造器

Lombok 是编译期注解处理器:编译时根据注解,自动把 getter/setter 等方法"生成"进字节码。你源码里只写注解,编译出来的 class 是完整的。

二、最常用注解速查

注解生成什么
@Getter / @Settergetter / setter
@ToStringtoString
@EqualsAndHashCodeequals + hashCode
@NoArgsConstructor无参构造器
@RequiredArgsConstructor只有 final/@NonNull 字段的构造器
@AllArgsConstructor全字段构造器
@Data上面 getter/setter/toString/equals/hashCode 全打包 + 全参构造器
@Builder建造者模式(见《Lombok @Builder 实战》)
@Slf4j注入 log 日志对象
@NonNull参数空检查

三、@Data:最常用的"全家桶"

@Data 是最常用的注解,一个顶五个:

java
@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:一行搞定日志

java
@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 背后的设计思想,看《建造者模式》。