ddd-by-examples/library
学习资源用 Java 和 Spring Boot 把 Event Storming 到战术模式的 DDD 实践完整落成可运行示例。
项目介绍
这是一个以公共图书馆业务为背景的 DDD 教学项目,重点不在做成生产系统,而在于展示如何从领域描述出发,经过 Big Picture EventStorming、Example Mapping 和 Design Level EventStorming,再把结果落成模块化单体代码。项目划分出 catalogue 和 lending 两个限界上下文:前者接近 CRUD,后者承载真实业务逻辑并采用六边形架构(项目说明)。
lending 模型包含借阅占位、借出、受限图书、普通读者与研究者读者、逾期上限和每日清单等规则。代码演示了多种战术模式:聚合之间通过事件通信,并同时给出即时一致性与最终一致性两种实现和测试;领域对象不可变;纯函数在领域层声明、在基础设施层实现;用 AvailableBook、BookOnHold、CheckedOutBook 等类型表达状态;用 Vavr 的 Option、Either、Try 和模式匹配处理可选值、分支与异常;持久化使用原生 SQL、JdbcTemplate 和 Spring Data JDBC,而不使用 JPA。ArchUnit 测试守住包边界,Groovy 用 BDD 方式和领域 DSL 编写测试(设计取舍)。
适合已经熟悉 Spring、希望把 DDD 概念对应到具体代码的 Java 开发者,也适合正在讨论限界上下文、聚合一致性或函数式领域建模的团队。
快速使用
需要 Java 11 和 Maven(构建说明)。
在仓库根目录直接启动应用:
$ mvn spring-boot:run
内嵌 Tomcat 会在 8080 端口启动,上下文路径为空。若要生成 jar:
$ mvn clean package
随后构建并运行容器:
$ docker build -t spring/library .
$ docker run -ti --rm --name spring-library -p 8080:8080 spring/library
需要指标时,执行 docker-compose up 会同时启动应用、Prometheus 和 Grafana。应用通过 http://localhost:8080/actuator/prometheus 暴露 Micrometer 指标,Prometheus 在 9090 端口,Grafana 在 3000 端口;应用使用 local Spring profile 加载初始数据(监控配置)。
使用约束
- 构建目标为 Java 11 和 Maven,README 未说明对更新 JDK 的支持情况。
- 项目明确处于持续建设中,API 和模型代码可能变化。
- 领域模型为教学目的做了简化,不是完整的图书馆借阅实现。
- Spring 仅出现在基础设施层,每个上下文有独立的应用上下文;虽然示例混用了原生 SQL 与 Spring Data JDBC,README 建议同一应用或团队只保留一种持久化方案。
- 许可证为 MIT。
HotRepo 点评
仓库记录为 5,992 Star、845 Fork,在 2026-11-08 的 Java 日榜快照中新增 11 Star,位列第 10;未记录到全语言日榜名次,因此现有数据更像一个稳定的参考项目,而不是短期爆发的趋势项目。对学习型仓库而言这很合理:它的价值在于从 Event Storming 记录、架构约束到可测试代码的完整串联,而 Java 榜上的可见性说明仍有开发者在查找 Spring 项目中的 DDD 实践。
本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。