依赖方向
API — HTTP、校验、DTO、错误映射
Application — 编排用例与事务边界
Domain — 订单规则、状态与仓储接口
Infrastructure — 数据库、消息、外部系统实现
1. Spring 的角色:组装应用
Controller 接收 HTTP,Service 暴露用例,Repository 提供持久化实现。构造器注入让依赖显式且可替换。最重要的订单规则仍是普通 Java,不启动 Spring 也能测试。
2. 领域模型守住业务不变量
空订单不能提交、已提交订单不能修改、数量必须为正。规则放在 Order/OrderLine 内,而不是散落在 Controller。
判断:业务语言描述的规则通常属于领域;“先调 A 再调 B”通常属于应用服务。
3. 企业 API 边界
请求 DTO 用 Bean Validation 拦截结构错误;Controller 映射到 OrderView;异常由 Advice 统一变成 Problem Detail。真实项目还应加入 trace id、鉴权、分页与版本策略。
4. 测试金字塔
OrderServiceTest 用 Fake 快速验证规则;OrderControllerTest 启动 Spring 上下文,验证 JSON、校验和 HTTP 状态。前者多且快,后者少而关键。
./mvnw test
./mvnw spring-boot:run5. 向生产演进
- 用 JPA/PostgreSQL 实现仓储接口。
- 增加事务边界与乐观锁。
- 用 Outbox 可靠发布订单事件。
- 加入 Testcontainers、可观测性和鉴权。