Java/后端
Lombok 常用注解整理
在 Java 开发中,实体类往往充斥着大量的 getter、setter、构造方法、toString、equals、hashCode 等样板代码。Lombok 它通过注解的方式,在编译期自动生成这些样板代码,让源码变得干净清爽
Lombok 常用注解整理:告别重复代码,聚焦业务逻辑
在 Java 开发中,实体类往往充斥着大量的 getter、setter、构造方法、toString、equals、hashCode 等样板代码。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、toString、equals、hashCode |
@Getter / @Setter | 单独生成 getter 或 setter |
@Builder | 生成建造者模式,支持链式调用 |
@Slf4j | 自动注入日志对象 log |
@RequiredArgsConstructor | 为 final 字段生成构造方法,配合 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 会自动通过构造方法注入。
四、使用前提
- 引入 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'
- Maven:
- 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 自动生成的 equals 和 hashCode 会触发懒加载查询,可能导致性能问题甚至异常。建议只用 @Getter 和 @Setter。
3. 避免过度依赖
部分公司规范禁止或限制在复杂业务类上使用 Lombok,因为生成的代码与源码不一致,调试时可能带来困扰。对于中小项目和个人开发,可以放心使用;大型项目需遵循团队规范。
六、总结
Lombok 用注解代替了重复的样板代码,让 Java 代码更加简洁、易读。它的核心价值在于:
- 减少重复劳动,把精力留给业务逻辑。
- 提升代码可读性,实体类一目了然。
- 配合 Spring 等框架,简化依赖注入和日志配置。
常用的几个注解(@Data、@NoArgsConstructor、@AllArgsConstructor、@Builder、@Slf4j、@RequiredArgsConstructor)掌握后,开发效率会有明显提升。
当然,也要注意团队协作和特定框架下的避坑事项。合理使用,Lombok 会成为你 Java 开发中的得力助手。