分层与依赖方向
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、Repository | XxxDO / XxxMapper / XxxRepository |
data | 查询与写入的公共底座 | BaseRepository / PageQuery / PageQueries |
common / config | 上下文、线程、全局异常、框架装配 | MiniMaoContextHolder / ResponseUtils |
强制规则
app不得直接 importinfra.mapper——必须经 Repository。- Controller 只做参数绑定、校验、调用、返回,禁止写业务、查库、拼条件。
domain不得引用 Spring Web 类型,不得返回传输层对象。Repository层不得出现@Transactional。- 禁止字段注入
@Autowired,一律final+ 构造器。 - 禁止
System.out、new Date()这类写法(有禁用模式断言)。 - 禁止
new Thread与自建线程池,异步只用框架提供的执行器。
违反时报什么
不是警告,不是代码评审意见:构建失败,输出里点名类名、方法与行号。约定因此不需要靠人记。
过渡期例外
提示:个别历史类型存在反向依赖,属于过渡期例外,禁止扩散:新代码按本页规则写,遇到例外请登记而不是照抄。
最后更新 2026-10-09编辑此页 →