《Java 编程实战》目录
这一页是全书的总入口。它列出 16 章 48 节,也给出三条可以照着走的阅读路径。如果你不确定自己该从哪一章开始,先读下面的「读者画像与前置知识」,再对照「学习路径」选一条;如果你已经有明确目标,直接跳到「分部分章节」按编号定位。
全书结构是:前置 3 篇 + 正文 16 章 48 节 + 附录 4 篇,共 55 篇。正文按工程推进顺序分为六个部分,每一部分对应 libraryd 的一个真实阶段。
这本书解决什么问题
《Java 编程入门》结束在一个能跑的命令行程序上:内存仓储、六个 CLI 命令、JUnit 测试、可执行 jar。它能演示规则,但离开你的终端就活不了——数据重启即丢,没有并发访问,没有部署形态,也没有可观测性。
《Java 编程实战》要做的事情只有一件:把这个程序变成一个能部署、能被别人调用、出问题能查的服务。
具体拆开,是六个问题:
- 代码量上来后,单模块怎么拆,依赖怎么管,构建怎么可复现。
- 数据从内存搬到 PostgreSQL,JDBC、连接池、索引、事务、并发控制分别怎么用。
- 对外暴露 HTTP 接口时,路由、DTO、参数校验、错误契约怎么设计。
- 请求变多后,线程池、虚拟线程、异步编排、定时任务怎么组织。
- 线上出问题时,日志、指标、追踪、健康检查怎么提供证据。
- 发布时,缓存、集成测试、镜像、回滚怎么形成闭环。
这六个问题不是并列的知识点,而是一条有先后依赖的工程路线。书里的顺序就是推荐的实施顺序。
读者画像与前置知识
这本书默认你已经读完卷一,或者具备同等能力。具体来说:
- 能用
javac和mvn编译、测试、打包一个 Java 项目。 - 熟悉类、接口、record、enum、集合、泛型、Lambda、Stream、异常与 JUnit 5。
- 知道
pom.xml里的依赖、作用域和生命周期,但不一定管过多模块项目。 - 写过一些 SQL,知道
select、join、where,但没有系统处理过事务和索引。
如果上面有一条明显不成立,建议先回卷一补对应章节:语法问题看第 4–12 章,测试看第 16 章,Maven 看第 17 章。卷二的代码默认你能读懂 record 和 Stream,不会再解释基础语法。
四类读者的入口不同:
第一类:刚读完卷一,想按顺序做项目。 从第 1 章开始,一章不跳。每章的代码都建立在前一章的工程上,跳章会遇到「这个类上一章才出现」的问题。
第二类:会 Java,但没做过服务端。 第 1–2 章可以快速过,第 3–8 章细读,这是从单机程序到 Web 服务最陡的一段。第 9 章之后按需选读。
第三类:做过 Spring Boot,想理解框架替你做了什么。 重点读第 1、3、5、7、8、13 章,对照附录 D 的概念映射表。你不需要重新学一遍 JDBC,但需要看清事务边界、错误映射和可观测性在没有框架时是什么样子。
第四类:只查某个问题。 直接看「分部分章节」。每节末尾有小结和前后导航,跳读不会丢上下文;但涉及 schema 和领域模型的章节(3、4、5、6 章)建议按顺序读。
学习路径
路径一:完整实战(推荐,约 6 周)
| 周 | 内容 | 交付物 |
|---|---|---|
| 第 1 周 | 第 1–2 章 | 五模块工程能 mvn package,质量门禁能跑 |
| 第 2 周 | 第 3–4 章 | PostgreSQL 接上,图书与借阅能落库,查询有索引 |
| 第 3 周 | 第 5–6 章 | 借阅、归还、续借在事务里正确执行,JSON 契约稳定 |
| 第 4 周 | 第 7–8 章 | libraryd 能对外提供图书、借阅、归还、续借的完整 HTTP 接口,错误格式统一 |
| 第 5 周 | 第 9–11 章 | 并发、异步与定时任务有明确边界 |
| 第 6 周 | 第 12–16 章 | 日志、指标、追踪、缓存、集成测试、镜像与发布闭环 |
每周投入 8–12 小时。第 5 周和第 6 周内容密度最高,时间不够可以各拉长一周,但不建议跳过第 15 章的集成测试。
路径二:服务端速成(约 3 周)
第 1 章只读模块拆分与依赖治理两节,第 2 章跳过,第 3–8 章按顺序读,第 9–11 章只读虚拟线程和定时任务,第 12–13 章读日志与指标,第 15–16 章读 Testcontainers 与容器化。适合需要在两三周内接手一个 Java 服务的人。
路径三:按问题查(按需)
- 多模块 POM 越写越乱 → 1.1、1.2。
- 连接池耗尽或连接泄漏 → 3.2、附录 C。
- 查询慢、索引不生效 → 4.2。
- 两个人同时借同一本书 → 5.3。
- 接口错误格式不统一 → 8.2、8.3。
- 线程池打满、任务堆积 → 9.1、9.3。
- 线上只有日志没有指标 → 12.2、13.1、13.2。
- 发布后不敢回滚 → 16.3。
六个部分之间的依赖关系
第一部分 工程基座(1–2)
↓
第二部分 数据访问(3–6)
↓
第三部分 HTTP 服务(7–8)
↓
第四部分 并发与异步(9–11)
↓
第五部分 可观测性与缓存(12–14)
↓
第六部分 测试与交付(15–16)
第 3 章的仓储实现依赖第 1 章的模块边界;第 5 章的事务依赖第 3 章的连接池;第 7 章的路由依赖第 6 章的 DTO;第 13 章的指标依赖第 7 章的中间件;第 15 章的集成测试依赖前面全部章节。可以跳读,但不要跳依赖。
与卷一、Spring Boot 卷的分工
三套书解决三个不同阶段的问题:
| 书 | 起点 | 终点 | 不写什么 |
|---|---|---|---|
| 《Java 编程入门》 | 没写过 Java | 能测试、能打包的 CLI | 数据库、HTTP 框架、并发 |
| 《Java 编程实战》(本书) | 会 Java 与 Maven | 可部署的 libraryd 服务 | JVM 内部机制、GC 调优 |
| 《Spring Boot》三部曲 | 会 Java 基础 | 用 Spring 生态交付服务 | 不用框架时的手工装配 |
本书刻意不用 Spring。原因不是 Spring 不好,而是如果一上来就用 @Transactional、@Valid、Actuator,你会知道「怎么配置」,但不知道「框架在哪个位置替你做了事」。本书先把这些位置手工实现一遍:事务边界、参数校验、错误映射、健康检查、指标端点。读完再对照附录 D 的映射表看 Spring Boot,你会更容易判断哪些是框架能力、哪些是业务约束。
版本与示例约定
- 主线 JDK 25 LTS(Temurin 25.0.5),Maven 3.9.12,PostgreSQL 17。
- Web 层用 Javalin 7.2.4,JSON 用 Jackson 2.22.4;测试用 JUnit 5.14.4 与 Testcontainers 1.21.4。
- 所有依赖版本在父 POM 统一锁定,子模块不写版本;具体清单见附录 B。
- 代码块标语言:
java、sql、bash、text、xml、yaml、json、dockerfile。 - 输出与代码分离:Java 代码之后的
text块是真实输出;没有实际运行的内容会标注「示意」。 - 不写未验证的性能数字。涉及性能的地方给出可复现命令,结论留给读者在自己的机器上验证。
- 数据库实验用容器:
postgres:17-alpine,连接参数在每节开头给出。
分部分章节
第一部分:工程基座(第 1–2 章)
| 节 | 标题 | 一句话说明 |
|---|---|---|
| 1.1 | 从单模块到多模块 | 五个模块的边界怎么划,依赖方向怎么定 |
| 1.2 | 依赖治理 | BOM、作用域、冲突调解与 Enforcer |
| 1.3 | 可复现构建 | 插件锁定、时间戳与可重复打包 |
| 2.1 | 编译告警 | 把 -Xlint 从建议变成门禁 |
| 2.2 | 静态分析 | Checkstyle 与 SpotBugs 的规则取舍 |
| 2.3 | 质量门禁 | JaCoCo 覆盖率与 CI 流水线 |
第二部分:数据访问(第 3–6 章)
| 节 | 标题 | 一句话说明 |
|---|---|---|
| 3.1 | JDBC 基础 | Connection、PreparedStatement 与结果集 |
| 3.2 | HikariCP | 连接池参数、泄漏排查与监控 |
| 3.3 | 数据访问层 | 把 SQL 装进 Repository |
| 4.1 | 表设计 | 约束、范式与 libraryd 的 schema |
| 4.2 | 索引与执行计划 | 读懂 EXPLAIN,判断索引是否生效 |
| 4.3 | 分页、批量写与 N+1 | 列表接口最常见的三类性能问题 |
| 5.1 | JDBC 事务 | 提交、回滚与事务边界 |
| 5.2 | 隔离级别与 MVCC | PostgreSQL 在每种隔离级别下的真实行为 |
| 5.3 | 并发控制 | 唯一索引、条件更新与幂等 |
| 6.1 | Jackson 基础 | 绑定、命名策略与日期序列化 |
| 6.2 | DTO 设计 | 请求、响应与领域对象的边界 |
| 6.3 | 序列化边界 | 多态、循环引用与 JSONB |
第三部分:HTTP 服务(第 7–8 章)
| 节 | 标题 | 一句话说明 |
|---|---|---|
| 7.1 | Javalin 起步 | 路由、路径参数与 JSON 响应 |
| 7.2 | 中间件 | 请求 ID、访问日志与错误处理 |
| 7.3 | 优雅停机 | 停止接收、排空请求、释放资源 |
| 8.1 | 参数校验 | Jakarta Validation 与手写规则的边界 |
| 8.2 | 错误契约 | RFC 9457 Problem Details 的字段设计 |
| 8.3 | 异常映射 | 从领域错误到 HTTP 状态码 |
第四部分:并发与异步(第 9–11 章)
| 节 | 标题 | 一句话说明 |
|---|---|---|
| 9.1 | ExecutorService | 线程池参数、队列与饱和 |
| 9.2 | 虚拟线程 | 在 libraryd 里替换平台线程 |
| 9.3 | 背压与拒绝策略 | 让过载可见,而不是悄悄排队 |
| 10.1 | CompletableFuture | 组合、异常与超时 |
| 10.2 | 异步编排 | 并行查询与结果合并 |
| 10.3 | 异步边界 | 阻塞、上下文与可观测性 |
| 11.1 | ScheduledExecutorService | 周期任务、时钟与关闭 |
| 11.2 | 批处理 | 游标、分片与罚金结算 |
| 11.3 | 任务幂等 | 重复执行不出错 |
第五部分:可观测性与缓存(第 12–14 章)
| 节 | 标题 | 一句话说明 |
|---|---|---|
| 12.1 | SLF4J 与 Logback | 级别、Appender 与配置分层 |
| 12.2 | 结构化日志 | JSON、MDC 与请求上下文 |
| 12.3 | 日志规范 | 脱敏、采样与存储成本 |
| 13.1 | Micrometer | 计数器、计时器与 Prometheus |
| 13.2 | 追踪 | OpenTelemetry 与 W3C traceparent |
| 13.3 | 健康检查 | 依赖探测与就绪/存活 |
| 14.1 | 本地缓存 | Caffeine 与失效策略 |
| 14.2 | 缓存模式 | Cache-Aside、穿透与雪崩 |
| 14.3 | 分布式缓存 | Redis 与一致性取舍 |
第六部分:测试与交付(第 15–16 章)
| 节 | 标题 | 一句话说明 |
|---|---|---|
| 15.1 | 测试金字塔 | 单元、集成与端到端的分工 |
| 15.2 | Testcontainers | 用真实 PostgreSQL 做集成测试 |
| 15.3 | 端到端与 CI | 把服务跑起来验证 |
| 16.1 | 打包 | fat jar、jlink 与运行时镜像 |
| 16.2 | 容器化 | 多阶段 Dockerfile 与 Jib |
| 16.3 | 发布与回滚 | 配置、迁移与灰度 |
前置与附录
| 篇 | 内容 |
|---|---|
| 序 | 从「能运行」到「能上线」缺的是什么 |
| 前言 | 本书的写法、约定与验证方式 |
| 附录 A | 多模块 POM 与常用插件配置模板 |
| 附录 B | JDBC、HTTP、JSON、日志、测试、缓存的选型对比 |
| 附录 C | 端口、连接池、Flyway、容器与测试排错 |
| 附录 D | 与《Spring Boot》三部曲的概念映射 |
学习本书的三个提醒
- 每节代码至少跑一遍。 第 3 章之后几乎每节都依赖数据库或容器,跳过运行会让「看起来懂了」和「能排错」之间的差距越来越大。
- 先写测试再改规则。 借阅、归还、续借的规则跨了五章,没有测试保护时,一处改动很容易破坏前面的行为。
- 不要同时引入所有能力。 第 9–14 章的线程池、异步、缓存、指标,每一项都有适用边界;先把一件事做对,再叠加下一件。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。