Java 后端项目结构设计:按业务拆分 + DDD 分层实践(完整指南)
在很多 Java 后端项目中常见的项目结构通常是这样controller service mapper entity这种结构在小项目中问题不大但随着系统复杂度上升很容易出现Service 变成巨型类God Service业务逻辑、数据库代码、第三方调用混在一起不同业务之间耦合严重项目越来越难维护因此在中大型项目中通常会采用DDDDomain Driven Design领域驱动设计的结构并且先按业务拆分模块再在每个业务模块内部做 DDD 分层。核心思想先分业务模块 再在模块内部做 DDD 分层一、为什么需要这种结构传统三层结构Controller Service Mapper随着业务增加很容易变成UserService ├─ 调 mapper ├─ 调 redis ├─ 调 mq ├─ 调 api ├─ 写业务规则 ├─ 写流程逻辑最终变成Service 巨型业务类问题包括业务逻辑与技术实现混在一起不同业务之间互相调用修改一个功能可能影响多个模块DDD 的目标就是让业务逻辑独立出来技术实现解耦。二、项目整体结构采用按业务拆分模块的方式project │ ├── modules │ ├── user │ ├── order │ ├── pay │ └── ai │ ├── shared │ ├── resources │ └── ProjectApplication.java其中modules 各业务模块 shared 公共模块三、业务模块内部结构DDD 分层每个业务模块内部再做DDD 分层设计user │ ├── controller ├── application ├── domain ├── infrastructure ├── dto └── assembler完整示例user │ ├── controller │ └── UserController.java │ ├── application │ ├── service │ │ └── UserApplicationService.java │ ├── command │ │ └── CreateUserCommand.java │ └── query │ └── UserQueryService.java │ ├── domain │ ├── model │ │ └── User.java │ ├── repository │ │ └── UserRepository.java │ ├── service │ │ └── UserDomainService.java │ └── event │ └── UserCreatedEvent.java │ ├── infrastructure │ ├── persistence │ │ ├── mapper │ │ │ └── UserMapper.java │ │ ├── dataobject │ │ │ └── UserDO.java │ │ └── repository │ │ └── UserRepositoryImpl.java │ │ │ ├── cache │ │ └── UserCacheRepository.java │ │ │ ├── client │ │ └── SmsClient.java │ │ │ └── mq │ └── UserProducer.java │ ├── dto │ ├── CreateUserRequest.java │ └── UserResponse.java │ └── assembler └── UserAssembler.java四、各层职责1 Controller接口层职责接收 HTTP 请求 参数校验 调用 Application 层 返回结果示例RestController public class UserController { private final UserApplicationService userApplicationService; PostMapping(/users) public UserResponse createUser(RequestBody CreateUserRequest request) { return userApplicationService.createUser(request); } }2 Application应用层职责业务流程编排 事务控制 调用 DomainApplication 层不写业务规则只负责流程。例如创建用户 发送短信 记录日志3 Domain领域层这是DDD 的核心层。职责业务规则 领域模型 领域能力例如用户必须唯一 订单金额必须大于0 库存不足不能下单Domain 常见结构model repository service event其中repository 只定义接口示例public interface UserRepository { User findById(Long id); void save(User user); }4 Infrastructure基础设施层职责实现 Domain 接口 与外部技术资源交互例如数据库 Redis MQ 第三方 API示例Repository public class UserRepositoryImpl implements UserRepository { private final UserMapper userMapper; Override public User findById(Long id) { UserDO userDO userMapper.selectById(id); return convert(userDO); } }五、Shared 公共模块项目中通常会有一个shared 模块shared │ ├── config ├── common ├── exception ├── security ├── util └── enums例如统一返回 Result 全局异常处理 工具类 配置类 安全组件六、DDD 最核心思想DDD 的核心原则是Domain 定义能力Infrastructure 实现能力。例如Domain └── UserRepository接口 Infrastructure └── UserRepositoryImpl实现这样可以实现业务规则 与 技术实现 解耦例如未来MySQL → MongoDB Redis → Memcached Kafka → RocketMQ只需要修改InfrastructureDomain 层无需变化。七、总结DDD 模块化结构可以总结为先按业务拆模块 再在模块内部做 DDD 分层每层职责controller 接口入口 application 业务流程编排 domain 业务规则 infrastructure 技术实现 dto 请求响应对象 assembler 对象转换 shared 公共组件最终实现业务模块清晰 技术实现解耦 系统更易维护和扩展八、一句话理解 DDDDomain 定义能力Infrastructure 实现能力。下一篇再升级一版“大厂级项目结构”增加 facade / executor / event / acl / consumer / converter 等那一版会更接近真正大型互联网项目架构。Java 后端项目结构设计DDD 模块化架构大厂级项目结构

相关新闻

openclaw实战【一】

openclaw实战【一】

前言 在上一篇实战中,我们体验了 OpenClaw 的基础能力:搜索、总结、浏览器自动化。这次我们将进入 实战二:进阶自动化与知识库构建,让你真正把 OpenClaw 打造成一个能自主运行、持续积累知识的“数字员工”。全文约 1500 字&#…

2026/5/17 10:20:04 阅读更多 →
SSH 远程ubuntu,开启copliot 卡顿修复方法

SSH 远程ubuntu,开启copliot 卡顿修复方法

SSH 远程ubuntu,开启copliot 卡顿修复方法"remote.extensionKind": { "GitHub.copilot": [ "ui" ], "github.copilot-chat": [ "ui" ] }, 删去

2026/5/17 10:20:02 阅读更多 →
计算机毕业设计java基于spring+协同过滤推荐算法的电影周边商城系统基于SpringBoot的电影周边产品电商平台设计协同过滤算法驱动的电影衍生品推荐系统研发

计算机毕业设计java基于spring+协同过滤推荐算法的电影周边商城系统基于SpringBoot的电影周边产品电商平台设计协同过滤算法驱动的电影衍生品推荐系统研发

计算机毕业设计java基于spring协同过滤推荐算法的电影周边商城系统177o59 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着电影产业的蓬勃发展和粉丝经济的日益壮大&#…

2026/7/3 8:07:20 阅读更多 →

最新新闻

11、<简单>有一个六位数,其个位数字7,现将个位数字移至首位(十万位),而其余各位数字顺序不变,均后退一位,得到一个新的六位数,假如新数为I旧数的4倍,求原来的六位数

11、<简单>有一个六位数,其个位数字7,现将个位数字移至首位(十万位),而其余各位数字顺序不变,均后退一位,得到一个新的六位数,假如新数为I旧数的4倍,求原来的六位数

#include <iostream> using namespace std;int main() {// old 是原六位数&#xff0c;个位固定为7for (long old 100007; old < 999997; old 10){// 拆分前5位long front old / 10;// 个位7移到十万位&#xff0c;生成新六位数long newNum 700000 front;// 判断…

2026/7/5 13:40:12 阅读更多 →
终极精简指南:使用PowerShell脚本让Windows 11瘦身50%

终极精简指南:使用PowerShell脚本让Windows 11瘦身50%

终极精简指南&#xff1a;使用PowerShell脚本让Windows 11瘦身50% 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否曾为Windows 11那臃肿的系统体积和缓慢的…

2026/7/5 13:40:12 阅读更多 →
从《中国统计年鉴》到可比数据:手把手教你计算不变价GDP

从《中国统计年鉴》到可比数据:手把手教你计算不变价GDP

1. 为什么需要计算不变价GDP&#xff1f; 我第一次接触GDP数据时&#xff0c;发现一个奇怪现象&#xff1a;某城市2000年GDP是1000亿元&#xff0c;2020年GDP是8000亿元&#xff0c;看起来增长了8倍。但老师告诉我&#xff0c;这个比较毫无意义&#xff0c;因为没考虑物价变化。…

2026/7/5 13:40:12 阅读更多 →
编程启蒙|Scratch 转 Python 系列第 3 天完整教程

编程启蒙|Scratch 转 Python 系列第 3 天完整教程

本篇是零基础 Python 自学系列 Scratch 转 Python 第 3 天笔记&#xff0c;适合纯小白入门&#xff0c;内容包含实操代码、详细讲解与配套练习题&#xff0c;全程 Scratch 积木代码 Python 双向对照教学。 一、昨日内容复盘&#xff08;Scratch 转 Python Day2 for 循环与 ra…

2026/7/5 13:36:11 阅读更多 →
玄鹿电竞:用技术重构游戏服务体验,驱动专业护航

玄鹿电竞:用技术重构游戏服务体验,驱动专业护航

在《三角洲行动》的战场中&#xff0c;你是否曾因“老六蹲撤”“摸金翻车”“任务卡关”而遗憾&#xff1f;玄鹿电竞以技术为引擎&#xff0c;打造全链路专业护航平台&#xff0c;从下单、匹配、服务到售后&#xff0c;用数字化架构重构游戏服务体验&#xff0c;让“稳撤满载”…

2026/7/5 13:34:10 阅读更多 →
18、<简单>寻找距离2的幂最近的数字

18、<简单>寻找距离2的幂最近的数字

#include <iostream> using namespace std;int main() {int n;cout << "请输入整数n&#xff1a;";cin >> n;// 先找到小于等于n的最大2的幂 lowint low 1;while (low * 2 < n){low * 2;}int high low * 2; // 大于n的最小2的幂int dis_low …

2026/7/5 13:32:10 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻