Java/后端

Lombok 常用注解整理

在 Java 开发中,实体类往往充斥着大量的 getter、setter、构造方法、toString、equals、hashCode 等样板代码。Lombok 它通过注解的方式,在编译期自动生成这些样板代码,让源码变得干净清爽

Lombok 常用注解整理:告别重复代码,聚焦业务逻辑

在 Java 开发中,实体类往往充斥着大量的 getter、setter、构造方法、toStringequalshashCode 等样板代码。Lombok 它通过注解的方式,在编译期自动生成这些样板代码,让源码变得干净清爽。


一、构造方法注解

1. @NoArgsConstructor

作用:生成一个无参构造方法。

@NoArgsConstructor
public class User {
    private Long id;
    private String name;
}

编译后等价于:

public class User {
    private Long id;
    private String name;

    public User() {
    }
}

为什么需要它? 很多框架(MyBatis、Jackson、Spring 等)在通过反射创建对象时,要求类必须有无参构造方法。如果你手动写了全参构造,Java 就不会再自动生成无参构造,此时加上 @NoArgsConstructor 可以省去手动编写的麻烦。

2. @AllArgsConstructor

作用:生成包含所有字段的全参构造方法。

@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
}

编译后等价于:

public class User {
    private Long id;
    private String name;
    private Integer age;

    public User(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

使用时可以直接:

User user = new User(1L, "张三", 18);

二、不用 Lombok 的写法对比

纯手写:

public class User {
    private Long id;
    private String name;

    public User() {
    }

    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{id=" + id + ", name='" + name + "'}";
    }
}

使用 Lombok:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
}

代码量减少 80% 以上,可读性大幅提升。


三、其他高频 Lombok 注解

除了构造方法,Lombok 还提供了许多实用注解,以下是最常用的几个。

注解作用
@Data生成 getter、setter、toStringequalshashCode
@Getter / @Setter单独生成 getter 或 setter
@Builder生成建造者模式,支持链式调用
@Slf4j自动注入日志对象 log
@RequiredArgsConstructorfinal 字段生成构造方法,配合 Spring 依赖注入

1. @Data —— 全能选手

@Data 等价于 @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor。写 DTO、VO 时一个注解搞定。

2. @Builder —— 优雅创建对象

当构造参数过多时,用 @Builder 可以链式赋值,避免参数顺序传错。

User user = User.builder()
                .name("张三")
                .age(18)
                .build();

3. @Slf4j —— 日志利器

传统写法:

private static final Logger log = LoggerFactory.getLogger(User.class);

使用 Lombok:

@Slf4j
public class UserService {
    public void doSomething() {
        log.info("执行了 doSomething");
    }
}

4. @RequiredArgsConstructor —— Spring 注入好帮手

@Service
@RequiredArgsConstructor
public class UserService {
    private final UserDao userDao;  // 自动生成包含 userDao 的构造方法
}

无需再写 @Autowired,Spring 会自动通过构造方法注入。


四、使用前提

  1. 引入 Lombok 依赖
    • Maven:
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.30</version>
          <scope>provided</scope>
      </dependency>
    • Gradle:
      compileOnly 'org.projectlombok:lombok:1.18.30'
      annotationProcessor 'org.projectlombok:lombok:1.18.30'
  2. IDE 安装 Lombok 插件如果插件未安装,IDE 会误报“找不到 getter/setter”等错误,但项目仍可正常编译。
    • IntelliJ IDEA:内置支持,无需额外安装。
    • VS Code:安装 Lombok Annotations Support for VS Code
    • Eclipse:需手动安装。

五、避坑指南

Lombok 虽好,但在某些场景下需要谨慎使用。

1. 团队协作

若项目使用 Lombok,所有成员都必须安装对应插件,否则代码在他们那里会大量报红,影响开发体验。

2. JPA 实体类慎用 @Data

在使用 Spring Data JPA 时,实体类上不要使用 @Data。因为 @Data 自动生成的 equalshashCode 会触发懒加载查询,可能导致性能问题甚至异常。建议只用 @Getter@Setter

3. 避免过度依赖

部分公司规范禁止或限制在复杂业务类上使用 Lombok,因为生成的代码与源码不一致,调试时可能带来困扰。对于中小项目和个人开发,可以放心使用;大型项目需遵循团队规范。


六、总结

Lombok 用注解代替了重复的样板代码,让 Java 代码更加简洁、易读。它的核心价值在于:

  • 减少重复劳动,把精力留给业务逻辑。
  • 提升代码可读性,实体类一目了然。
  • 配合 Spring 等框架,简化依赖注入和日志配置。

常用的几个注解(@Data@NoArgsConstructor@AllArgsConstructor@Builder@Slf4j@RequiredArgsConstructor)掌握后,开发效率会有明显提升。

当然,也要注意团队协作和特定框架下的避坑事项。合理使用,Lombok 会成为你 Java 开发中的得力助手。