目录
[三、DDD 是什么?](#三、DDD 是什么?)
[四、DDD 的核心目标](#四、DDD 的核心目标)
[五、DDD 核心概念](#五、DDD 核心概念)
[八、什么是值对象(Value Object)](#八、什么是值对象(Value Object))
[十、什么是 Repository](#十、什么是 Repository)
[十一、DDD 四层架构](#十一、DDD 四层架构)
[十二、DDD 项目目录设计](#十二、DDD 项目目录设计)
[十三、为什么需要 Maven 多模块](#十三、为什么需要 Maven 多模块)
[十四、DDD 与 Maven 多模块结合](#十四、DDD 与 Maven 多模块结合)
[十六、Domain 模块](#十六、Domain 模块)
[十七、Application 模块](#十七、Application 模块)
[十八、Infrastructure 模块](#十八、Infrastructure 模块)
[十九、Interface 模块](#十九、Interface 模块)
[二十、DDD + Spring Boot 实战结构](#二十、DDD + Spring Boot 实战结构)
[二十二、DDD 的优缺点](#二十二、DDD 的优缺点)
[DDD 和 MVC 有什么区别?](#DDD 和 MVC 有什么区别?)
[Repository 和 Mapper 有什么区别?](#Repository 和 Mapper 有什么区别?)
[DDD 一定要微服务吗?](#DDD 一定要微服务吗?)
一、前言
很多 Java 项目在初期都长这样:
src
├─ controller
├─ service
├─ mapper
├─ entity
├─ vo
└─ dto
刚开始项目规模较小时:
10个接口
20张表
5个开发人员
完全没有问题。
但随着业务增长:
100+接口
300+数据表
20+开发人员
问题逐渐暴露:
Service越来越大
Mapper越来越多
模块之间相互调用
代码耦合严重
需求修改牵一发动全身
最终演变成:
"屎山项目"
于是软件工程领域提出了:
DDD
即:
Domain Driven Design
领域驱动设计
DDD 的核心思想就是:
用业务领域组织代码,而不是用技术分层组织代码。
二、传统三层架构的问题
经典 Spring 项目:

目录结构:
com.demo
├─ controller
├─ service
├─ mapper
├─ entity
├─ dto
├─ vo
例如订单业务:
OrderController
OrderService
OrderMapper
用户业务:
UserController
UserService
UserMapper
商品业务:
ProductController
ProductService
ProductMapper
项目变大后:
Service超过100个
Mapper超过200个
Entity超过300个
查找代码非常困难。
三、DDD 是什么?
DDD:
Domain Driven Design
由:
Eric Evans
在 2003 年提出。
核心思想:
以业务领域为中心
而非技术框架为中心
例如电商系统:
用户域
订单域
商品域
支付域
库存域
而不是:
controller
service
mapper
四、DDD 的核心目标
DDD 主要解决:
复杂业务系统
问题。
目标:
高内聚
低耦合
业务隔离
团队协作
一句话总结:
让代码结构和业务结构保持一致。
五、DDD 核心概念
DDD 中最重要的几个概念:
领域(Domain)
实体(Entity)
值对象(VO)
聚合(Aggregate)
领域服务(Domain Service)
仓储(Repository)
限界上下文(Bounded Context)
六、什么是领域(Domain)
例如:
电商系统:
用户
订单
支付
库存
每一个业务模块:
都是一个领域
架构图:

七、什么是实体(Entity)
实体:
拥有唯一标识
例如:
用户:
java
public class User {
private Long id;
private String username;
}
其中:
id
就是实体标识。
八、什么是值对象(Value Object)
值对象:
没有唯一标识
只关注属性值
例如:
地址:
java
public class Address {
private String province;
private String city;
private String detail;
}
两个地址内容相同:
即可认为相同
九、什么是聚合(Aggregate)
订单:
订单
订单项
收货地址
实际上属于同一个业务整体。
DDD 称为:
聚合
例如:
java
public class Order {
private Long orderId;
private List<OrderItem> items;
private Address address;
}
聚合中的核心对象:
聚合根(Aggregate Root)
即:
Order
十、什么是 Repository
传统:
OrderMapper
DDD:
OrderRepository
作用:
封装数据访问
例如:
java
public interface OrderRepository {
Order findById(Long id);
void save(Order order);
}
业务层无需关注:
MySQL
Redis
ES
具体实现。
十一、DDD 四层架构
经典 DDD:

Interface
接口层:
Controller
Feign
MQ
负责:
接收请求
Application
应用层:
流程编排
例如:
createOrder()
payOrder()
Domain
领域层:
核心业务规则
DDD 最重要的一层。
Infrastructure
基础设施层:
MySQL
Redis
MQ
ES
十二、DDD 项目目录设计
订单领域:
order-domain
├─ aggregate
├─ entity
├─ valueobject
├─ repository
├─ service
应用层:
order-application
接口层:
order-interface
基础设施:
order-infrastructure
十三、为什么需要 Maven 多模块
很多项目:
一个工程
几十万个代码文件
编译慢:
启动慢
维护困难
因此:
模块拆分
成为必然选择。
十四、DDD 与 Maven 多模块结合
推荐结构:
mall-system
├─ mall-interface
├─ mall-application
├─ mall-domain
├─ mall-infrastructure
├─ mall-common
架构图:

依赖方向:
单向依赖
禁止:
domain依赖interface
十五、父工程配置
父工程:
XML
<packaging>pom</packaging>
XML
<modules>
<module>mall-interface</module>
<module>mall-application</module>
<module>mall-domain</module>
<module>mall-infrastructure</module>
</modules>
十六、Domain 模块
负责:
核心业务
例如:
java
public class Order {
public void pay() {
if(status == PAID){
throw new RuntimeException(
"订单已支付"
);
}
status = PAID;
}
}
注意:
不依赖Spring
十七、Application 模块
负责:
业务流程编排
例如:
java
@Service
public class OrderApplicationService {
public void createOrder(){
//创建订单
//扣库存
//发送MQ
}
}
十八、Infrastructure 模块
实现 Repository:
java
@Repository
public class OrderRepositoryImpl
implements OrderRepository {
}
负责:
数据库
Redis
MQ
访问。
十九、Interface 模块
Controller:
java
@RestController
@RequestMapping("/order")
public class OrderController {
@PostMapping
public void create(){
}
}
只负责:
请求与响应
二十、DDD + Spring Boot 实战结构
mall-system
├─ mall-common
├─ mall-domain
│ ├─ entity
│ ├─ aggregate
│ ├─ repository
├─ mall-application
│ ├─ service
├─ mall-infrastructure
│ ├─ mapper
│ ├─ redis
├─ mall-interface
│ ├─ controller
├─ mall-start
其中:
mall-start
作为启动模块。
二十一、微服务时代的演进
DDD 与微服务天然契合。
例如:
用户域
拆分:
user-service
订单域
拆分:
order-service
支付域
拆分:
pay-service
架构:

二十二、DDD 的优缺点
优点:
业务清晰
职责明确
便于扩展
适合大型系统
缺点:
学习成本高
开发复杂
小项目收益有限
因此:
CRUD项目
不要强上DDD
二十三、面试高频问题
DDD 和 MVC 有什么区别?
MVC:
按技术分层
DDD:
按业务领域分层
Repository 和 Mapper 有什么区别?
Mapper:
关注SQL
Repository:
关注领域对象
DDD 一定要微服务吗?
不是。
DDD:
是一种设计思想
单体项目也可以使用。
二十四、总结
传统三层架构:
Controller
↓
Service
↓
Mapper
适合:
中小型项目
DDD:
Interface
↓
Application
↓
Domain
↓
Infrastructure
适合:
复杂业务系统
而 Maven 多模块则帮助我们:
降低耦合
独立编译
团队协作
领域隔离
最终形成:
DDD负责业务建模
Maven负责物理拆分
两者结合后,可以构建出既符合业务逻辑,又具备良好扩展性的现代 Java 企业级应用架构。
对于大型电商、支付、医疗、物流等复杂系统来说,这种架构已经成为当前主流的工程实践方案。