Skip to content

常用类库与工具 ​

S5-012建议学入门约 60 分钟JDK 21项目实战 · 工具与资源

1. 本节定位 ​

"要不要引一个工具库"是每个项目的日常决策 ✗✓。本节给出两类东西:

text
① 一个"常用类库清单"——每个都说明:解决什么、什么场景值得引入、什么坑 ✓
② 一条选型判断——引库的收益怎么算 ✗✓

★ 引用原则(比清单更重要) ✓✓✓:

引库的收益 = 省下的代码量 − 引入的成本(依赖、学习、升级、坑)

· 省 3 行代码的库 → 不值得 ✗ · 省 200 行且容易写错的代码(如日期处理、加解密)→ 值得 ✓✓

2. 学习目标 ​

  • 能按"收益公式"判断要不要引库 ★★★;
  • 知道本课程项目里实际用到的库及其岗位 ★★★;
  • 知道几个高频库的典型坑 ★★★。

3. 前置知识检查 ​

4. 核心概念 ​

4.1 本课程项目实际用到的库(先看真实例子)★★★ ​

库用在哪解决什么为什么值得
Spring Boot ★★★project-a、web-basics自动装配、内嵌容器、starter 生态省掉数百行配置 ✓✓
Spring JdbcTemplate ★★project-a薄封装 JDBC每条 SQL 可见可测(选型理由见 《项目 A:后端分层与接口设计》)✓
Jackson ★★★project-aJSON 序列化标配;坑是 record/日期序列化 ✓
JUnit 5 + Mockito ★★★全部 labs测试标配;Mockito 对新 JDK 的兼容要先验证(《项目 A:测试方案与分层测试》 实测 ✗)
Selenium ★★ui-testingUI 自动化唯一选择;坑是驱动版本 ✓

★ 反例也值得记 ✓:project-b 没有引任何库 ✗✓ —— 因为它是"最小可验证模型",引库会模糊"语义是自己实现还是库给的" ✓✓ —— 教学项目与生产项目的选型标准不同 ✓

4.2 值得了解的常用库 ★★ ​

库解决什么何时引入典型坑
Hutool ★★大杂烩工具(日期/加密/HTTP/Excel)快速原型、内部工具质量参差,核心链路慎用 ⚠️
Guava ★★集合扩展、限流(RateLimiter)、缓存需要多值 Map/本地缓存/限流版本升级曾不兼容 ⚠️
Lombok ★★★消灭 getter/setter/builder 样板几乎总是 ✓IDE 与编译器都要装插件/开注解处理 ✗;record 出现后价值下降(本项目领域对象全用 record ✓)
MapStruct ★★对象映射(DTO ↔ Entity)字段多、转换多时 ✓手写映射也别完全放弃——映射错误编译期不报 ⚠️
Jackson ★★★JSON几乎总是 ✓record 反序列化要 jackson-databind 2.12+;日期要显式格式 ✓
Resilience4j ★★熔断/重试/限流需要 Sentinel 之外的选择与 Sentinel 二选一(《Sentinel 限流与熔断》)✓

4.3 三条高频坑(真实踩过/高频事故)★★★ ​

① Lombok 与 record ✓✓:

record 出现后,纯数据载体的 getter 需求大减 ✓ Lombok 剩下的高价值场景:@Builder、@Slf4j ✓ 本项目全部用 record(领域对象不可变,见 《项目 A:后端分层与接口设计》)✓

② Jackson 与 record/日期 ✓✓:

· record 反序列化需要较新 Jackson(Spring Boot 3.x 自带够用 ✓) · LocalDateTime 默认输出数组 ✗ → 配 write-dates-as-timestamps: false(project-a 已配 ✓)

③ 工具库的"质量分层" ✓✓:

核心链路(支付/扣库存)→ 用成熟大库或自己写 ✓✓ 边缘链路(内部工具、一次性脚本)→ Hutool 随便用 ✓ 判断依据:这个库的 bug 你能承受吗? ✓✓

4.4 引库的四步检查 ★★★ ​

text
① 它解决的问题是"我的高频痛点"吗?(不是 → 不引)✓
② 它的维护状态如何?(最近提交、issue 响应、Star 趋势)✓✓
③ 传递依赖会不会与现有依赖冲突?(mvn dependency:tree 看)✓✓
④ 有没有更"标准"的替代?(JDK 自带 > 成熟大库 > 小众库)✓✓

★ 一条硬规则 ✓✓:

JDK 自带能满足的,优先 JDK —— Optional、CompletableFuture、java.time、record、Stream 已经覆盖了大量"以前要引库"的场景 ✓✓

6. 递进示例 ​

6.1 最小示例:不引库的日期处理 ​

java
// JDK 自带(java.time)—— 本项目所有时间计算都用它 ✓
LocalDateTime dueAt = borrowAt.plusDays(rules.getBorrowDays());
long days = Duration.between(dueAt.toLocalDate().atStartOfDay(),
                             end.toLocalDate().atStartOfDay()).toDays();

6.2 业务示例:值得引库的场景 ​

java
// 导出 Excel:手写 POI 要几百行且易错 → 引 EasyExcel/Hutool ✓✓

6.3 反例:为一个小函数引一个大库 ​

java
// ✗ 只为用 StringUtils.isBlank 引整个 commons-lang3
// ✓ JDK 自带:s == null || s.isBlank()

7. 实测 ​

本课程 24 个模块的依赖清单本身就是实测样本 ✓:

powershell
cd labs
.\mvnw.cmd -B -ntp dependency:tree | Select-String -Pattern "compile" | Measure-Object

★ 观察:核心业务模块(project-a)依赖极少 ✓(web/jdbc/h2/pg + test)—— 这正是"按需引库"的结果 ✓

8. Debug 观察点 ​

  1. mvn dependency:tree:看每个库带进了什么传递依赖 ✓✓;
  2. 升级一个库的小版本:跑全量测试(JDK 兼容问题就是这么暴露的)✓✓;
  3. 删掉一个"以为在用"的库:看编译是否报错(找出真正的僵尸依赖)✓✓。

9. 常见错误 ​

#错误说明
1为省几行代码引库 ✗成本大于收益 ✓✓
2核心链路用小众库 ✗✗bug 承受不起 ✓✓
3不看传递依赖 ✗✗版本冲突(JAR 地狱)✓
4JDK 已有还引库 ✗无谓的依赖 ✓
5测试工具不验证 JDK 兼容 ✗✗本项目 Mockito/JDK25 实测 ✗✓

10. 动手实验 ​

  1. 给 project-a 跑 dependency:tree,数出直接依赖与传递依赖 ✓✓;
  2. 尝试删一个"僵尸依赖",编译验证 ✓✓;
  3. 用 record 重写一个 Lombok 类,对比 ✓;
  4. 升级一个库的 patch 版本,跑全量测试 ✓。

验收方式:能说出"你项目里每个库解决什么问题、去掉会怎样"。

扩展任务:写一份团队依赖规范:允许引入的白名单、引入前必查项(维护状态/传递依赖/许可证)、升级流程 ✓✓

11. 练习题 ​

  1. 判断:工具库越全越好,Hutool 应该作为所有项目的标配。(对 / 错)
  2. 填空:引库收益 = ______ − ______。
  3. 简答:为什么本项目领域对象用 record 而不是 Lombok?
  4. (判断)s == null || s.isBlank() 需要引 commons-lang3 吗?
  5. (设计)团队要统一 JSON 库,你怎么做决策?
参考答案(要点)
  1. 错 ✗。核心链路慎用大杂烩库 ✗✓ —— 质量/可维护性分层判断 ✓★
  2. 省下的代码量;引入的成本(依赖/学习/升级/坑) ✓
  3. record 表达"不可变数据"的意图更清晰 ✓,不需要 IDE 插件与注解处理器 ✓, 纯数据载体下 Lombok 的价值大减 ✓★
  4. 不需要 ✗✓ —— JDK 11+ 自带 String.isBlank() ✓★
  5. 要点:以框架默认(Spring Boot 管理 Jackson)为默认 ✓✓; 列出候选维度(性能/功能/维护/团队熟悉度)✓; 用 POC 验证本项目真实数据结构(record/日期/泛型)✓✓; 定死版本与升级流程 ✓★

12. 掌握标准 ​

  • [ ] 能用收益公式判断引库 ★★★;
  • [ ] 知道本课程项目各库的岗位 ★★★;
  • [ ] 知道 Lombok/Jackson/工具库的高频坑 ★★★;
  • [ ] 会做引库四步检查 ★★★。

13. 扩展资源 ​

14. 下一步学习 ​

《IDEA 插件与效率工具》。

前置知识

无,可直接开始

后续知识

暂无

进度只保存在本机浏览器,可随时清除

个人学习项目:AI 生成内容均经人工复核,第三方资源仅作索引