用途:在已有的 DDD 风格 Spring Boot 3 应用中演进聚合不变量、值对象或领域事件时使用,或在明确要求 DDD 时使用。
主要能力:聚合规则(每个聚合根一个 repository,外部只通过根访问子实体,跨聚合优先按 ID 引用,边界由需原子提交的不变量与预期争用决定,而非固定子实体数量);值对象(不可变、无标识、按值相等,示例含 Money 与 EmailAddress);领域事件(不可变 record,在聚合中收集、保存后发布,可用 @DomainEvents 与 @AfterDomainEventPublication 让 Spring Data 在每次 save() 时自动排空并发布);Specification 组合复杂查询;防腐层(ACL)位于基础设施层,将外部系统或遗留代码的模型翻译为领域语言。
使用方式:代码片段为示意,需应用的领域类型与导入;除任务包含迁移外,保留既有公开标识符与持久化映射。事件可在事务内用 ApplicationEventPublisher 发布,或交由 Spring Data 自动发布;监听用 @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) 绑定提交。
限制:两种发布机制都不保证持久投递,必需外部效果应持久化 outbox 条目或使用持久发布登记表,并配幂等消费者与重试/恢复;@Async 只改变执行方式不改变持久性;提交后数据库写入需新事务。货币使用提供方精确表示,避免二进制浮点。
验证:测试聚合不变量、回滚阻止外部通知、提交后崩溃恢复的持久发布,并确认既有 API ID 与数据库关系兼容。常见陷阱:贫血模型、用值对象替换既有 Long/UUID API ID、领域逻辑放入服务、外部直接访问子实体、混淆 save 与 commit、按任意子实体数量拆分聚合、外部模型泄漏进领域。