Skip to content

2026-08-27 · 用注解自动生成 getter/setter/构造方法等模板代码——告别手写样板。

Lombok 快速上手

1. Lombok 解决什么问题

传统写法的痛点:

java
public class Student {
    private String name;
    private int age;
    private String email;

    // 一个类要写一堆 getter/setter/构造方法/toString...
    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; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    public Student() {}
    public Student(String name, int age, String email) { ... }
    @Override public String toString() { ... }
    @Override public boolean equals(Object o) { ... }
    @Override public int hashCode() { ... }
    // 写了 20 多行,实际什么逻辑都没有
}

Lombok 写法:

java
@Data
public class Student {
    private String name;
    private int age;
    private String email;
}
// 一行 @Data 替代上面全部(getter/setter/toString/equals/hashCode/无参构造)

2. 安装

IDEA 插件

File → Settings → Plugins → 搜索 Lombok → Install → 重启 IDEA

Maven 依赖

pom.xml 加:

xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

scope=provided 表示 Lombok 只在编译时用,不会打进 jar 包(它不是运行时依赖)。

3. 常用注解

@Data(最常用)

自动生成:getter、setter、toString、equals、hashCode、无参构造

java
@Data
public class Student {
    private String name;
    private int age;
}

// 自动生成:
// getName()、setName()、getAge()、setAge()
// toString()、equals()、hashCode()
// 无参构造方法

@Getter / @Setter(只生成 getter 或 setter)

java
@Getter
@Setter
public class Student {
    private String name;  // 只有 getName(),没有 setName()
    private int age;      // 只有 getAge(),没有 setAge()
}

想让某些字段只读(没有 setter),就单独加 @Getter。

@NoArgsConstructor / @AllArgsConstructor

java
@NoArgsConstructor   // 生成无参构造
@AllArgsConstructor  // 生成全参构造(所有字段)
@Data
public class Student {
    private String name;
    private int age;
}

// 使用
Student s1 = new Student();           // 无参构造
Student s2 = new Student("张三", 20); // 全参构造

@ToString

java
@ToString
public class Student {
    private String name;
    private int age;
}

// 输出:Student(name=张三, age=20)

@Slf4j(日志)

java
@Slf4j
public class UserService {
    public void save() {
        log.info("保存用户");    // 等价于 LoggerFactory.getLogger(...)
        log.error("保存失败");
    }
}

@Slf4j 生成一个 log 变量(基于 SLF4J + Logback),Spring Boot 项目里大量使用。

4. 组合使用

实际开发中常用组合:

java
// Spring Boot 实体类标准写法
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private String email;
}

// Service 类标准写法
@Slf4j
@Service
public class UserService {
    public void save(User user) {
        log.info("保存用户:{}", user.getName());
    }
}

Lombok 本质是编译时注解处理器,在编译阶段生成字节码,运行时没有额外开销。

5. 常见坑

java
// 坑1:@Data 会生成 equals,子类继承时可能有问题
// 解决:子类用 @EqualsAndHashCode(callSuper = true)
@Data
@EqualsAndHashCode(callSuper = true)
public class Admin extends User {
    private String role;
}

// 坑2:@Data 生成的无参构造和 @AllArgsConstructor 冲突
// 解决:手动指定需要的构造方法,不用 @Data

日常开发用 @Data 即可,遇到继承场景再加 @EqualsAndHashCode(callSuper = true)。