>[info]什么是Lombok?
Lombok是一个Java库,通过注解处理器在编译时自动生成样板代码,从而显著减少Java开发中的重复性代码。它能让开发者专注于业务逻辑而非机械性的代码编写。
>[info]Lombok速查表(全表格版)
| 模块 | 条目 | 内容 |
|---|---|---|
| 定位 | 一句话定义 | 编译期注解处理器,自动生成 Java 样板代码 |
| 核心价值 | 3 大作用 | ① 消样板(getter/setter/构造/toString/equals/hashCode/log)<br>② 提效率(代码量 ↓30~50%)<br>③ 增可读(类结构突出业务字段) |
| 常用注解 | 高频 10 注解 | `@Data` `@Getter/@Setter` `@ToString` `@NoArgsConstructor` `@AllArgsConstructor` `@RequiredArgsConstructor` `@Builder` `@Slf4j` `@Value` `@SneakyThrows` |
| 注解速查 | `@Data` | 一键生成 getter + setter + toString + equals + hashCode(不含无参构造) |
| 注解速查 | `@Builder` | 链式建造者模式:`User.builder().id(1L).name("Tom").build()` |
| 注解速查 | `@Slf4j` | 自动注入 `private static final Logger log = LoggerFactory.getLogger(Xxx.class)` |
| 注解速查 | `@Value` | 不可变 DTO:字段 `final`、只生成 getter、无 setter |
| 代码量对比 | 同一 POJO | 手写:≈80 行;Lombok:≈5 行(注解行数) |
| 日志对比 | 声明日志对象 | 手写:2 行导入 + 1 行声明;Lombok:`@Slf4j` 即可 |
| 优点汇总 | 5 条 | ① 代码量锐减 ② 开发提速 ③ 维护省心 ④ 建造者优雅 ⑤ 日志即插即用 |
| 缺点汇总 | 5 条 | ① 调试不可见 ② 需 IDE 插件 ③ 团队必须统一 ④ 隐藏实现细节 ⑤ 增加编译依赖 |
| 适用场景 | 推荐 | 快速迭代、内部项目、POJO/DTO/实体类 |
| 慎用场景 | 不推荐 | 频繁调试的复杂业务类、新手多且未统一规范的项目 |
>[info]Lombok的核心作用
#### 1. **消除样板代码**
- 自动生成getter/setter方法
- 自动生成构造方法(无参、全参、必需字段)
- 自动生成toString()、equals()、hashCode()方法
- 自动生成日志对象
#### 2. **提高开发效率**
- 减少代码编写量(通常可减少30-50%的代码)
- 降低维护成本
- 避免手写代码可能引入的错误
#### 3. **增强代码可读性**
- 让类结构更加清晰
- 突出业务字段而非机械方法
### 常用注解及功能
| 注解 | 功能描述 |
|------|----------|
| `@Data` | 一站式生成getter、setter、toString、equals、hashCode |
| `@Getter/@Setter` | 单独生成getter或setter方法 |
| `@ToString` | 生成toString方法,可排除敏感字段 |
| `@NoArgsConstructor` | 生成无参构造方法 |
| `@AllArgsConstructor` | 生成全参构造方法 |
| `@RequiredArgsConstructor` | 生成必需字段的构造方法 |
| `@Builder` | 实现建造者模式,支持链式调用 |
| `@Slf4j` | 自动生成日志对象 |
| `@Value` | 生成不可变类(所有字段为final) |
| `@SneakyThrows` | 简化异常处理 |
### 使用Lombok vs 不使用Lombok对比
#### **实体类对比示例**
**不使用Lombok:**
```java
public class User {
private Long id;
private String username;
private Integer age;
private String email;
// 无参构造
public User() {}
// 全参构造
public User(Long id, String username, Integer age, String email) {
this.id = id;
this.username = username;
this.age = age;
this.email = email;
}
// getter和setter方法
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
// toString方法
@Override
public String toString() {
return "User(id=" + id + ", username=" + username +
", age=" + age + ", email=" + email + ")";
}
// equals和hashCode方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id) &&
Objects.equals(username, user.username) &&
Objects.equals(age, user.age) &&
Objects.equals(email, user.email);
}
@Override
public int hashCode() {
return Objects.hash(id, username, age, email);
}
}
```
**使用Lombok:**
```java
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String username;
private Integer age;
private String email;
}
```
#### **日志记录对比**
**不使用Lombok:**
```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OrderService {
private static final Logger log = LoggerFactory.getLogger(OrderService.class);
public void createOrder() {
log.info("开始创建订单");
// 业务逻辑
}
}
```
**使用Lombok:**
```java
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class OrderService {
public void createOrder() {
log.info("开始创建订单");
// 业务逻辑
}
}
```
### Lombok的优点
1. **显著提升开发效率**
- 减少50%以上的样板代码
- 更快的开发速度
2. **代码更加简洁**
- 类结构清晰,突出业务字段
- 减少视觉噪音
3. **降低维护成本**
- 修改字段时无需手动更新相关方法
- 避免人为错误
4. **支持建造者模式**
- `@Builder`注解让复杂对象的创建变得优雅
5. **日志集成便利**
- 一行注解即可拥有日志对象
### Lombok的缺点
1. **调试困难**
- 生成的代码在源码中不可见
- 调试时无法直接查看生成的方法
2. **IDE依赖**
- 需要安装Lombok插件才能正常开发
- 新团队成员需要额外配置
3. **团队协作要求**
- 团队成员必须统一使用Lombok
- 否则会造成代码冲突
4. **隐藏实现细节**
- 可能让新手开发者困惑
- 不利于理解Java基础机制
5. **编译时依赖**
- 增加了项目的构建依赖
- 可能影响某些构建工具
### 使用建议
1. **适合使用的场景:**
- 快速原型开发
- 内部项目或团队统一的项目
- POJO、DTO、实体类等简单对象
2. **谨慎使用的场景:**
- 需要频繁调试的复杂业务类
- 对代码可读性要求极高的项目
- 团队成员技术水平参差不齐的项目
3. **最佳实践:**
- 团队内部统一规范
- 合理使用注解组合
- 保持对Java基础机制的理解
- 定期review生成的代码
Lombok是一个强大的工具,合理使用可以大幅提升开发效率,但需要在便利性和可控性之间找到平衡。
- 环境配置
- window怎么配置java环境变量?
- SQL学习
- 字段类型
- 1、 所有可声明的字段类型
- 2、常用的可声明的字段类型
- 创建表和表内字段
- 1、整个创建表语句
- 2、设置id主键
- 3、设置业务主键,唯一索引
- 4、设置业务字段
- 5、普通索引
- 6、唯一索引与普通索引的区别
- 7、表的引擎、字符集、排序规则和注释的设置
- Java基础语法
- 数据类型
- Java中的数据类型
- LocalDate
- 常用的数据类型
- Java 常用数据类型方法
- Java中数组、list、Map、HashMap
- 如何用Map来优化那些复杂的“双重 for 循环”查询?
- Java 8 中steam()操作流
- Java中HashMap和JSON
- Java中的JSONObject
- 工具类
- Java 常用工具类
- Arrays工具类
- Java 时间工具类
- 泛型
- Java中泛型概念
- Java中的泛型容器
- 泛型参数与函数参数的区别
- 推断出泛型实参
- Lambda表达式
- 数据分层
- 异常处理
- Java8 异常处理类总结表
- MyBatis-Plus 常用异常类总结表
- Java高级特性
- Maven
- jib-maven-plugin
- 什么是Spring Boot 的 parent pom?
- maven中各个生命周期的含义
- Spring Boot
- maven与spring boot 的关系
- Java中的连接池
- Spring JDBC
- Spring JDBC的概念
- JdbcTemplate常用的方法
- Spring中Bean的概念
- Spring中的抽象,通俗解释一下
- Spring中的事物
- Spring中的事物,通俗解释一下
- Spring中的事物抽象,常见的有哪些,列举一下
- Spring中常用的事物场景有哪些,列举一下
- Spring事务管理有哪些注解?
- Spring中使用事物处理订单的案例,列举说明一下
- Spring中声明式事务、分布式事务以及编程式事务的区别,列举一下
- 配置文件
- application-properties配置文件
- Spring Boot 的启动
- spring boot项目如何启动?
- 列举一下Spring Boot的启动过程
- SpringApplication.run方法
- Spring Boot 启动时有哪些接口?
- CommandLineRunner
- Spring Boot 的常用注解
- 系统注解
- 表格:系统注解
- @Override
- @Deprecated
- @SuppressWarnnings
- 使用在类名上的注解
- 表格:使用在类名上的注解
- @RestController
- @Controller
- @Service
- @Repository
- @Component
- @Configuration
- @Resource
- @Autowired
- @RequestMapping
- @GetMapping
- @PostMapping
- @Transactional
- @Qualifier
- 使用在方法上的注解
- 表格:使用在方法上的注解
- @RequestBody
- @PathVariable
- @Bean
- @ResponseBody
- @PreAuthorize
- 其他常用注解
- 表格:其他常用注解
- @EnableAutoConfiguration
- @SpringBootApplication
- @EnableScheduling
- @EnableAsync
- @ComponentScan
- @Aspec
- @ControllerAdvice
- @ExceptionHandler
- @Value
- @ConfigurationProperties
- @EnableConfigurationProperties
- @MapperScan
- @ApiOperation
- @Produces
- Validator验证的常用注解
- spring IoC容器
- Spring IoC容器依赖注入实现方式
- 常用依赖
- RESTEasy
- resteasy简介
- RESTEasy框架(依赖)的功能和常用注解
- MyBatis
- 简介
- paginationInterceptor
- @TableName
- @TableId
- @Param
- MyBatis-Plus
- MyBatis-Plus简介
- MyBatis-Plus的工具类
- Mybatis-Plus扩展的工具类和方法
- MyBatis-Plus中最常用的工具类方法
- MyBatis-Plus 中最常用的 4 大核心工具类
- Wrapper条件构造器
- Wrapper条件构造器详解
- Wrapper条件构造器eq等方法的参数说明
- LambdaQueryWrapper与QueryWrapper
- 日期格式是否必须转换
- Lombok
- Lombok作用详解
- @Data
- @Slf4j
- @Builder
- @EqualsAndHashCode
- @Accessors
- Jackson
- Jackson简介
- @JsonFormat
- Jackson高效地在 HashMap 和 JSON 字符串之间进行相互转换
- Hutool
- Hutool简介
- hutool依赖常用的方法
- fastjson2
- fastjson2简介
- UrlBasedCorsConfigurationSource
- 生态相关
- JBoss 社区
- 支付系统
- 1. 初始化mysql数据库流程
- 2. 初始化redis数据库的流程
- 3. 初始化rabbitmq服务
- 环球置业
- 1.模块目录结构分析
- 2. DTO(数据传输层)的核心作用
- 3. VO(视图对象层)
- 4. VO(视图对象层)和 DTO 数据传输层 的区别
