架构

分层与依赖方向

app → domain → data/infra → common/config,方向只允许向下,由构建强制。

分层不是为了好看,是为了让任何人和任何 AI 拿到需求时,能预判代码该落在哪一层。

依赖方向

app  ──▶  domain  ──▶  data / infra  ──▶  common / config
 ▲                                        │
 └────────────── 禁止反向 ─────────────────┘

注意:反向依赖不是"不推荐",是构建失败:断言会点名文件与方法。

各层职责

层职责典型类型
app接收请求、校验入参、DTO↔VO 转换、编排调用XxxController / XxxService / XxxDTO / XxxVO
domain多步骤流程、跨表一致性、规则编排XxxHandler / XxxCmd / 枚举 / 异常
infra只碰数据库:表映射实体、Mapper、RepositoryXxxDO / XxxMapper / XxxRepository
data查询与写入的公共底座BaseRepository / PageQuery / PageQueries
common / config上下文、线程、全局异常、框架装配MiniMaoContextHolder / ResponseUtils

强制规则

  • app 不得直接 import infra.mapper——必须经 Repository。
  • Controller 只做参数绑定、校验、调用、返回,禁止写业务、查库、拼条件。
  • domain 不得引用 Spring Web 类型,不得返回传输层对象。
  • Repository 层不得出现 @Transactional。
  • 禁止字段注入 @Autowired,一律 final + 构造器。
  • 禁止 System.out、new Date() 这类写法(有禁用模式断言)。
  • 禁止 new Thread 与自建线程池,异步只用框架提供的执行器。

违反时报什么

不是警告,不是代码评审意见:构建失败,输出里点名类名、方法与行号。约定因此不需要靠人记。

过渡期例外

提示:个别历史类型存在反向依赖,属于过渡期例外,禁止扩散:新代码按本页规则写,遇到例外请登记而不是照抄。

最后更新 2026-10-09编辑此页 →