Lombok 的核心注解围绕消除 Java 模板代码 设计,覆盖字段方法生成、构造器、日志、对象创建、资源管理等核心场景。以下是最常用的 8 个核心注解,按使用频率和重要性分类详解,附场景化示例和避坑要点:
一、基础字段方法简化注解(最核心)
这类注解解决 POJO 类中 getter/setter、toString、equals/hashCode 等重复代码问题。
1. @Getter / @Setter(基础)
-
核心作用 :为类的字段生成
getXxx()/setXxx()方法(可单独用在类/字段上)。 -
使用场景:仅需生成部分字段的 get/set,或自定义访问权限。
-
示例 :
javaimport lombok.Getter; import lombok.Setter; import lombok.AccessLevel; public class User { // 类级别:为所有字段生成public的get/set(final字段仅生成get) @Getter @Setter private Long id; // 字段级别:仅为username生成get,且setter为protected @Getter @Setter(AccessLevel.PROTECTED) private String username; // 禁用setter:仅生成getter @Getter @Setter(AccessLevel.NONE) private String password; }
2. @Data(一站式聚合)
-
核心作用 :聚合
@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor,一键生成核心方法(日常开发最常用)。 -
关键坑点 :不生成无参构造器 ,需配合
@NoArgsConstructor(框架如 Spring/MyBatis 必备)。 -
示例 :
javaimport lombok.Data; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; @Data // 核心:生成get/set/toString/equals/hashCode/RequiredArgsConstructor @NoArgsConstructor // 补充无参构造(必须加!) @AllArgsConstructor // 补充全参构造(按需) public class User { private Long id; private String username; // 排除toString:密码不泄露 @ToString.Exclude private String password; }
3. @ToString(自定义 toString 方法)
-
核心作用 :生成包含指定字段的
toString(),避免手动拼接字符串。 -
进阶用法:排除敏感字段、包含父类字段。
-
示例 :
javaimport lombok.ToString; @ToString( exclude = "password", // 排除密码字段 callSuper = true // 包含父类字段(默认false) ) public class User extends BaseEntity { private Long id; private String username; private String password; }
4. @EqualsAndHashCode(自定义相等判断)
-
核心作用 :基于指定字段生成
equals()和hashCode()(默认所有非静态字段)。 -
ORM 场景必调:JPA/MyBatis 实体类建议仅基于主键(id)生成,避免业务字段修改导致 hash 变化。
-
示例 :
javaimport lombok.EqualsAndHashCode; @EqualsAndHashCode(of = "id") // 仅基于id生成(忽略其他字段) public class User { private Long id; // 主键 private String username; // 业务字段(不参与相等判断) }
二、构造器注解(解决对象初始化)
Lombok 提供 3 个构造器注解,覆盖不同初始化场景,解决 new 对象时参数繁琐 问题。
1. @NoArgsConstructor(无参构造)
- 核心作用 :生成无参构造器
public User() {}。 - 必用场景 :Spring MVC 接收参数、MyBatis 反射实例化、Jackson 反序列化等(
@Data不生成,必须手动加)。
2. @RequiredArgsConstructor(必填字段构造器)
-
核心作用 :为
final 字段或@NonNull 注解字段生成构造器(@Data已聚合)。 -
使用场景:依赖注入(如 Spring 构造器注入)。
-
示例 :
javaimport lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor // 为final字段生成构造器 public class UserService { // 构造器注入(无需@Autowired) private final UserMapper userMapper; private final RedisTemplate<String, Object> redisTemplate; }
3. @AllArgsConstructor(全参构造)
- 核心作用:为所有字段生成全参构造器(参数顺序与字段定义一致)。
- 注意 :参数过多时可读性差,建议用
@Builder替代。
三、日志注解(简化日志声明)
核心是 @Slf4j,替代手动声明 Logger,之前已详细讲过,此处补充核心要点:
-
注解 :
@Slf4j(推荐)、@Log4j2(高性能日志)、@CommonsLog(老旧框架)。 -
核心价值 :自动生成
private static final Logger log = ...,直接用log变量。 -
示例 :
javaimport lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RestController; @Slf4j // 生成log变量 @RestController public class UserController { public void getUser(Long id) { log.info("查询用户,ID:{}", id); // 直接使用 } }
四、高级对象创建注解
1. @Builder(建造者模式)
-
核心作用:生成链式调用的建造者方法,替代繁琐的 setXxx() 或全参构造。
-
使用场景:对象参数多、可选参数多的场景(如创建复杂实体)。
-
示例 :
javaimport lombok.Data; import lombok.Builder; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Builder // 启用建造者模式 public class User { private Long id; private String username; private Integer age; } // 使用:链式创建对象 User user = User.builder() .id(1L) .username("zhangsan") .age(20) .build();
2. @Value(不可变类注解)
-
核心作用 :生成"不可变类"(所有字段默认
final),仅生成getter,无setter,替代@Data + 全final字段。 -
使用场景:DTO/VO 等无需修改的对象(如接口返回值)。
-
示例 :
javaimport lombok.Value; @Value // 所有字段final + 仅生成getter + 无参构造(需手动加@NoArgsConstructor) @NoArgsConstructor(force = true) // force=true:为final字段赋默认值(如null) public class UserVO { Long id; String username; }
五、实用工具注解
1. @NonNull(非空校验)
-
核心作用 :为字段的
setter/构造器添加非空校验,null 时抛NullPointerException(NPE)。 -
示例 :
javaimport lombok.Data; import lombok.NonNull; @Data public class User { @NonNull // 非空校验:setUsername(null)会抛NPE private String username; }
2. @Cleanup(自动关闭资源)
-
核心作用 :自动关闭 IO 流/连接(替代 try-finally),支持
close()方法的资源。 -
示例 :
javaimport lombok.Cleanup; import java.io.FileReader; import java.io.IOException; public class FileUtil { public String readFile(String path) throws IOException { @Cleanup FileReader reader = new FileReader(path); // 自动关闭reader char[] buf = new char[1024]; reader.read(buf); return new String(buf); } }
3. @SneakyThrows(隐藏异常捕获)
-
核心作用:自动捕获受检异常并包装为运行时异常,无需手动 try-catch。
-
使用场景:简化代码(谨慎使用,避免掩盖异常)。
-
示例 :
javaimport lombok.SneakyThrows; import java.io.IOException; public class Demo { @SneakyThrows(IOException.class) // 捕获IOException并抛出 public void read() { // 无需try-catch new FileReader("test.txt").read(); } }
三、核心注解组合使用(实战示例)
java
import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import lombok.ToString;
@Data // 基础方法
@NoArgsConstructor // 无参构造
@AllArgsConstructor // 全参构造
@Builder // 建造者模式
@ToString(exclude = "password") // 排除密码
public class User {
private Long id;
@NonNull // 非空校验
private String username;
private String password;
// 仅id参与相等判断
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id.equals(user.id);
}
@Override
public int hashCode() {
return id.hashCode();
}
}
四、避坑核心要点
@Data必加@NoArgsConstructor:框架反射实例化需要无参构造,否则报NoSuchMethodException;- ORM 实体类慎用
@Data的equals/hashCode:建议用@EqualsAndHashCode(of = "id")仅基于主键生成; - 敏感字段必排除 :密码/令牌用
@ToString.Exclude避免泄露; @Builder配合构造器 :需加@NoArgsConstructor + @AllArgsConstructor,否则build()可能报错;- 生产环境禁用
@SneakyThrows:避免掩盖关键异常,仅在非核心逻辑使用。
总结
Lombok 核心注解可分为 4 类:
| 类别 | 核心注解 | 核心场景 |
|---|---|---|
| 字段方法 | @Getter/@Setter、@Data |
POJO 类简化 |
| 构造器 | @NoArgsConstructor、@Builder |
对象初始化 |
| 日志 | @Slf4j |
日志记录 |
| 工具类 | @NonNull、@Cleanup |
非空校验、资源管理 |
日常开发中,@Data + @NoArgsConstructor + @Slf4j + @Builder 是最常用的组合,能覆盖 90% 以上的模板代码场景。