主题
界面
主题
"要不要引一个工具库"是每个项目的日常决策 ✗✓。本节给出两类东西:
① 一个"常用类库清单"——每个都说明:解决什么、什么场景值得引入、什么坑 ✓
② 一条选型判断——引库的收益怎么算 ✗✓★ 引用原则(比清单更重要) ✓✓✓:
引库的收益 = 省下的代码量 − 引入的成本(依赖、学习、升级、坑)
· 省 3 行代码的库 → 不值得 ✗ · 省 200 行且容易写错的代码(如日期处理、加解密)→ 值得 ✓✓
| 库 | 用在哪 | 解决什么 | 为什么值得 |
|---|---|---|---|
| Spring Boot ★★★ | project-a、web-basics | 自动装配、内嵌容器、starter 生态 | 省掉数百行配置 ✓✓ |
| Spring JdbcTemplate ★★ | project-a | 薄封装 JDBC | 每条 SQL 可见可测(选型理由见 《项目 A:后端分层与接口设计》)✓ |
| Jackson ★★★ | project-a | JSON 序列化 | 标配;坑是 record/日期序列化 ✓ |
| JUnit 5 + Mockito ★★★ | 全部 labs | 测试 | 标配;Mockito 对新 JDK 的兼容要先验证(《项目 A:测试方案与分层测试》 实测 ✗) |
| Selenium ★★ | ui-testing | UI 自动化 | 唯一选择;坑是驱动版本 ✓ |
★ 反例也值得记 ✓:project-b 没有引任何库 ✗✓ —— 因为它是"最小可验证模型",引库会模糊"语义是自己实现还是库给的" ✓✓ —— 教学项目与生产项目的选型标准不同 ✓
| 库 | 解决什么 | 何时引入 | 典型坑 |
|---|---|---|---|
| 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 限流与熔断》)✓ |
① 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 你能承受吗? ✓✓
① 它解决的问题是"我的高频痛点"吗?(不是 → 不引)✓
② 它的维护状态如何?(最近提交、issue 响应、Star 趋势)✓✓
③ 传递依赖会不会与现有依赖冲突?(mvn dependency:tree 看)✓✓
④ 有没有更"标准"的替代?(JDK 自带 > 成熟大库 > 小众库)✓✓★ 一条硬规则 ✓✓:
JDK 自带能满足的,优先 JDK ——
Optional、CompletableFuture、java.time、record、Stream已经覆盖了大量"以前要引库"的场景 ✓✓
// JDK 自带(java.time)—— 本项目所有时间计算都用它 ✓
LocalDateTime dueAt = borrowAt.plusDays(rules.getBorrowDays());
long days = Duration.between(dueAt.toLocalDate().atStartOfDay(),
end.toLocalDate().atStartOfDay()).toDays();// 导出 Excel:手写 POI 要几百行且易错 → 引 EasyExcel/Hutool ✓✓// ✗ 只为用 StringUtils.isBlank 引整个 commons-lang3
// ✓ JDK 自带:s == null || s.isBlank()本课程 24 个模块的依赖清单本身就是实测样本 ✓:
cd labs
.\mvnw.cmd -B -ntp dependency:tree | Select-String -Pattern "compile" | Measure-Object★ 观察:核心业务模块(project-a)依赖极少 ✓(web/jdbc/h2/pg + test)—— 这正是"按需引库"的结果 ✓
mvn dependency:tree:看每个库带进了什么传递依赖 ✓✓;| # | 错误 | 说明 |
|---|---|---|
| 1 | 为省几行代码引库 ✗ | 成本大于收益 ✓✓ |
| 2 | 核心链路用小众库 ✗✗ | bug 承受不起 ✓✓ |
| 3 | 不看传递依赖 ✗✗ | 版本冲突(JAR 地狱)✓ |
| 4 | JDK 已有还引库 ✗ | 无谓的依赖 ✓ |
| 5 | 测试工具不验证 JDK 兼容 ✗✗ | 本项目 Mockito/JDK25 实测 ✗✓ |
dependency:tree,数出直接依赖与传递依赖 ✓✓;验收方式:能说出"你项目里每个库解决什么问题、去掉会怎样"。
扩展任务:写一份团队依赖规范:允许引入的白名单、引入前必查项(维护状态/传递依赖/许可证)、升级流程 ✓✓
s == null || s.isBlank() 需要引 commons-lang3 吗?String.isBlank() ✓★无,可直接开始
暂无