DDD 设计与 Maven 多模块拆分:从单体项目到领域驱动架构实践

目录

一、前言

二、传统三层架构的问题

[三、DDD 是什么?](#三、DDD 是什么?)

[四、DDD 的核心目标](#四、DDD 的核心目标)

[五、DDD 核心概念](#五、DDD 核心概念)

六、什么是领域(Domain)

七、什么是实体(Entity)

[八、什么是值对象(Value Object)](#八、什么是值对象(Value Object))

九、什么是聚合(Aggregate)

[十、什么是 Repository](#十、什么是 Repository)

[十一、DDD 四层架构](#十一、DDD 四层架构)

Interface

Application

Domain

Infrastructure

[十二、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 企业级应用架构。

对于大型电商、支付、医疗、物流等复杂系统来说,这种架构已经成为当前主流的工程实践方案。

相关推荐
爱吃羊的老虎1 小时前
【JAVA】python转java:Spring Boot 如何处理 Web 请求
java·前端·spring boot·http
码不停蹄的玄黓1 小时前
SpringBoot 循环依赖解决方案
java·spring boot·后端
装不满的克莱因瓶1 小时前
Spring 全家桶与 Spring 6 新特性详解:从 IoC 到云原生时代
java·spring·云原生·jdk·新特性·spring6
ch.ju1 小时前
Java程序设计(第3版)第四章——私有属性
java·开发语言
@insist1231 小时前
系统架构设计师-系统可靠性模型计算全解析
架构·系统架构·软考·系统架构设计师·软件水平考试
装不满的克莱因瓶1 小时前
JSON 处理与内嵌 Tomcat 部署:Spring Boot 如何实现前后端数据交互与一键启动?
java·spring boot·spring·架构·tomcat·json
我命由我123451 小时前
Android Service - Service 生命周期变化、Service 与 Activity 双向交互
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
团象科技1 小时前
出海企业技术架构优化实地观察 拆解AWS Lambda无服务器的落地细节
架构·serverless·aws
Thecozzy1 小时前
Understand-Anything架构感悟
架构