lombok的几个核心注解是什么?

Lombok 的核心注解围绕消除 Java 模板代码 设计,覆盖字段方法生成、构造器、日志、对象创建、资源管理等核心场景。以下是最常用的 8 个核心注解,按使用频率和重要性分类详解,附场景化示例和避坑要点:

一、基础字段方法简化注解(最核心)

这类注解解决 POJO 类中 getter/settertoStringequals/hashCode 等重复代码问题。

1. @Getter / @Setter(基础)
  • 核心作用 :为类的字段生成 getXxx()/setXxx() 方法(可单独用在类/字段上)。

  • 使用场景:仅需生成部分字段的 get/set,或自定义访问权限。

  • 示例

    java 复制代码
    import 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 必备)。

  • 示例

    java 复制代码
    import 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(),避免手动拼接字符串。

  • 进阶用法:排除敏感字段、包含父类字段。

  • 示例

    java 复制代码
    import 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 变化。

  • 示例

    java 复制代码
    import 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 构造器注入)。

  • 示例

    java 复制代码
    import 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 变量。

  • 示例

    java 复制代码
    import 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() 或全参构造。

  • 使用场景:对象参数多、可选参数多的场景(如创建复杂实体)。

  • 示例

    java 复制代码
    import 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 等无需修改的对象(如接口返回值)。

  • 示例

    java 复制代码
    import 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)。

  • 示例

    java 复制代码
    import lombok.Data;
    import lombok.NonNull;
    
    @Data
    public class User {
        @NonNull // 非空校验:setUsername(null)会抛NPE
        private String username;
    }
2. @Cleanup(自动关闭资源)
  • 核心作用 :自动关闭 IO 流/连接(替代 try-finally),支持 close() 方法的资源。

  • 示例

    java 复制代码
    import 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。

  • 使用场景:简化代码(谨慎使用,避免掩盖异常)。

  • 示例

    java 复制代码
    import 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();
    }
}

四、避坑核心要点

  1. @Data 必加 @NoArgsConstructor :框架反射实例化需要无参构造,否则报 NoSuchMethodException
  2. ORM 实体类慎用 @Dataequals/hashCode :建议用 @EqualsAndHashCode(of = "id") 仅基于主键生成;
  3. 敏感字段必排除 :密码/令牌用 @ToString.Exclude 避免泄露;
  4. @Builder 配合构造器 :需加 @NoArgsConstructor + @AllArgsConstructor,否则 build() 可能报错;
  5. 生产环境禁用 @SneakyThrows:避免掩盖关键异常,仅在非核心逻辑使用。

总结

Lombok 核心注解可分为 4 类:

类别 核心注解 核心场景
字段方法 @Getter/@Setter@Data POJO 类简化
构造器 @NoArgsConstructor@Builder 对象初始化
日志 @Slf4j 日志记录
工具类 @NonNull@Cleanup 非空校验、资源管理

日常开发中,@Data + @NoArgsConstructor + @Slf4j + @Builder 是最常用的组合,能覆盖 90% 以上的模板代码场景。

相关推荐
毕设源码-邱学长2 小时前
【开题答辩全过程】以 个性化新闻推荐系统为例,包含答辩的问题和答案
java
a程序小傲2 小时前
京东Java面试被问:ZGC的染色指针如何实现?内存屏障如何处理?
java·后端·python·面试
vx_bisheyuange3 小时前
基于SpringBoot的老年一站式服务平台
java·spring boot·后端·毕业设计
计算机毕设VX:Fegn08953 小时前
计算机毕业设计|基于Java + vue水果商城系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·课程设计
TH_13 小时前
2、前台工程使用代理,请求后台失败
java
川贝枇杷膏cbppg3 小时前
DmServiceDMSERVER.log是干嘛的
java·服务器·数据库
无敌最俊朗@3 小时前
Qt 多线程编程: moveToThread 模式讲解
java·开发语言
程序员清风4 小时前
别卷模型了!上下文工程才是大模型应用的王道!
java·后端·面试
go__Ahead4 小时前
【Java】ThreadLocal源码解析
java