创建Order项目实现Clean Hexagonal架构
创建Order项目实现Clean & Hexagonal架构
前言
在上一节中,讲到了Clean & Hexagonal架构的理论部分,并且通过图形解释了从MVC架构到清洁架构到演变。下面我们通过创建项目的方式来进一步理解Clean & Hexagonal架构。
1.项目创建
1. 项目整体结构规划
项目采用 Maven 多模块架构,父模块聚合子模块,依赖层级清晰。
结构说明:
order-system/ # 父项目(聚合所有子模块)
├── .git # Git 仓库目录
├── .gitignore # Git 忽略规则(如 target/、.DS_Store 等)
├── .idea/ # IntelliJ IDEA 配置目录(自动生成)
├── order-service/ # 订单服务模块(子模块)
│ ├── order-application/ # 应用层(接口、DTO、服务入口)
│ ├── order-container/ # 容器配置(Spring Boot 启动类)
│ ├── order-dataccess/ # 数据访问层(DAO、JPA/MyBatis 实现)
│ ├── order-domain/ # 领域层(领域模型、领域服务)
│ ├── order-message/ # 消息处理(MQ 消费者/生产者)
│ └── pom.xml # 子模块的 pom 文件
└── pom.xml # 父模块的 pom 文件
1.1 父项目order-system
父项目聚合了所有的子模块,进行统一的依赖管理,对应的pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.1</version><relativePath /></parent><groupId>com.jackmouse</groupId><artifactId>order-system</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>order-service</module></modules><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version></properties><dependencyManagement><dependencies><dependency><groupId>com.jackmouse</groupId><artifactId>order-domian-core</artifactId><version>${project.version}</version></dependency><dependency><groupId>com.jackmouse</groupId><artifactId>order-application-service</artifactId><version>${project.version}</version></dependency><dependency><groupId>com.jackmouse</groupId><artifactId>order-application</artifactId><version>${project.version}</version></dependency><dependency><groupId>com.jackmouse</groupId><artifactId>order-dataaccess</artifactId><version>${project.version}</version></dependency><dependency><groupId>com.jackmouse</groupId><artifactId>order-message</artifactId><version>${project.version}</version></dependency></dependencies></dependencyManagement><dependencies></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven-compiler-plugin.version}</version><configuration><release>17</release></configuration></plugin></plugins></build></project>
1.1 order-container(容器/启动模块)
-
作用:
- 包含 Spring Boot 的主启动类(
Application.java),是项目的入口。 - 负责整合所有子模块的依赖(如
order-application、order-dataccess等)。 - 配置全局属性(如数据源、消息队列连接、Web 端口等)。
- 包含 Spring Boot 的主启动类(
-
示例代码:
@SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} } -
pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.jackmouse</groupId><artifactId>order-service</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>order-container</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.jackmouse</groupId><artifactId>order-domian-core</artifactId></dependency><dependency><groupId>com.jackmouse</groupId><artifactId>order-application-service</artifactId></dependency><dependency><groupId>com.jackmouse</groupId><artifactId>order-application</artifactId></dependency><dependency><groupId>com.jackmouse</groupId><artifactId>order-message</artifactId></dependency></dependencies> </project>
1.2 order-application(应用层)
-
作用:
- 调用领域层(
order-domain)。 - 处理输入输出(如接收 HTTP 请求,返回 DTO 对象)。
- 调用领域层(
-
pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.jackmouse</groupId><artifactId>order-service</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>order-application</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.jackmouse</groupId><artifactId>order-application-service</artifactId></dependency></dependencies></project>
1.3 order-domain(领域层)
-
作用:
- 核心业务逻辑和领域模型(如
Order实体、OrderStatus值对象)。 - 定义领域服务(如校验订单规则的
OrderValidator)。 - 声明仓储接口(如
OrderRepository),但不实现具体逻辑。
- 核心业务逻辑和领域模型(如
-
可以将domain层在细化为service层和core层,service层实现具体的业务逻辑和外部接口的定义,core层定义实体和值对象。
-
关键文件:
Order.java(领域实体):
public class Order {private Long id;private String orderNumber;private BigDecimal totalAmount;public void cancel() {// 领域逻辑:校验订单是否可取消if (this.status == OrderStatus.SHIPPED) {throw new IllegalStateException("已发货订单不可取消");}this.status = OrderStatus.CANCELLED;} } -
pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.jackmouse</groupId><artifactId>order-service</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>order-domain</artifactId><packaging>pom</packaging><modules><module>order-domian-core</module><module>order-application-service</module></modules><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties></project>
1.4 order-dataccess(数据访问层)
-
作用:
- 实现领域层定义的仓储接口(如
OrderRepositoryImpl)。 - 集成 ORM 框架(如 JPA、MyBatis),操作数据库。
- 处理数据持久化细节(如分页查询、事务管理)。
- 实现领域层定义的仓储接口(如
-
关键文件:
OrderRepositoryImpl.java(仓储实现):
@Repository public class OrderRepositoryImpl implements OrderRepository {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic void save(Order order) {String sql = "INSERT INTO orders (...) VALUES (...)";jdbcTemplate.update(sql, ...);} } -
pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.jackmouse</groupId><artifactId>order-service</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>order-dataaccess</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.jackmouse</groupId><artifactId>order-application-service</artifactId></dependency></dependencies></project>
1.5 order-message(消息处理模块)
-
作用:
- 处理异步消息(如订单创建后发送 Kafka 事件)。
- 定义消息生产者(如
OrderEventPublisher)和消费者(如PaymentEventListener)。 - 解耦系统间通信,支持事件驱动架构。
-
关键文件:
OrderEventPublisher.java(消息生产者):
@Component public class OrderEventPublisher {@Autowiredprivate KafkaTemplate<String, OrderEvent> kafkaTemplate;public void publishOrderCreated(Order order) {OrderEvent event = new OrderEvent(order);kafkaTemplate.send("order-topic", event);} } -
pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.jackmouse</groupId><artifactId>order-service</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>order-message</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.jackmouse</groupId><artifactId>order-application-service</artifactId></dependency></dependencies></project>
2.生成依赖图
使用depgraph-maven-plugin插件可以生成项目的依赖关系。
首先要在系统安装graphviz(https://www.graphviz.org/):



mac使用brew安装过程中,可能会因为系统版本高导致报错

使用–build-from-source命令用从源代码安装,如
brew install --build-from-source graphviz
安装完成后在项目的根目录执行:
mvn com.github.ferstl:depgraph-maven-plugin:aggregate -DcreateImage=true -DreduceEdges=false -Dscope=compile "-Dincludes=com.jackmouse*:*"
com.jackmouse为你自己的包路径,执行成功后:

项目的target目录下会生成png文件:


可以看到domain层不依赖于其他任何外部部组件,所有外部服务(如数据库、消息队列、外部服务)都通过接口和适配器与业务逻辑交互。核心业务逻辑保持独立,易于测试和替换,使得系统具有更好的扩展性和灵活性。
相关文章:
创建Order项目实现Clean Hexagonal架构
创建Order项目实现Clean & Hexagonal架构 前言 在上一节中,讲到了Clean & Hexagonal架构的理论部分,并且通过图形解释了从MVC架构到清洁架构到演变。下面我们通过创建项目的方式来进一步理解Clean & Hexagonal架构。 1.项目创建 1. 项目…...
【算法】图论 —— Floyd算法 python
洛谷 B3647 【模板】Floyd 题目描述 给出一张由 n n n 个点 m m m 条边组成的无向图。 求出所有点对 ( i , j ) (i,j) (i,j) 之间的最短路径。 输入格式 第一行为两个整数 n , m n,m n,m,分别代表点的个数和边的条数。 接下来 m m m 行,每行三…...
YOLOv5 + SE注意力机制:提升目标检测性能的实践
一、引言 目标检测是计算机视觉领域的一个重要任务,广泛应用于自动驾驶、安防监控、工业检测等领域。YOLOv5作为YOLO系列的最新版本,以其高效性和准确性在实际应用中表现出色。然而,随着应用场景的复杂化,传统的卷积神经网络在处…...
基于fast-whisper模型的语音识别工具的设计与实现
目录 摘 要 第1章 绪 论 1.1 论文研究主要内容 1.1.1模型类型选择 1.1.2开发语言的选择 1.2 国内外现状 第2章 关键技术介绍 2.1 关键性开发技术的介绍 2.1.1 Faster-Whisper数据模型 2.1.2 Django 第3章 系统分析 3.1 构架概述 3.1.1 功能构架 3.1.2 模块需求描述 3.2 系统开…...
python中单例模式应用
数据库连接池单例模式 1. 为什么使用单例模式 创建数据库连接是一个昂贵的过程(涉及网络通信、认证等)。单例模式的连接池可以在程序启动时初始化一组连接,并在整个生命周期中重用这些连接,而不是每次请求都新建连接。同时还可…...
鸿蒙HarmonyOS 开发简介
鸿蒙开发入门教程 一、技术简介 鸿蒙操作系统(HarmonyOS)是面向万物互联时代的全场景分布式操作系统,具备分布式软总线、分布式数据管理、分布式任务调度等核心能力,能让设备间实现无缝连接与协同,为用户提供统一、流…...
2. 在后端代码中加入日志记录模块
1. 说明 日志模块基本上是每一个软件系统开发中必不可少的,主要用于持久记录一些代码运行中的输出信息,辅助编码人员进行代码调试,以及后期软件上线运行报错分析。在Python中加入日志模块比较简单,只需要借助logging和RotatingFi…...
Linux软硬链接
目录 什么是软链接?软链接的特点软链接的原理什么是硬链接硬链接的特点硬链接的原理 什么是软链接? 在Linux操作系统中,文件系统的核心概念之一是链接,包括软链接(符号链接)和硬链接。这些链接提供了访问文…...
Kali换源
【刚忘了】 下面这个 里面的一删放就好了 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contribdeb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib...
Java 大视界 -- Java 大数据机器学习模型的可解释性增强技术与应用(107)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
SYN Flood的攻击原理及防御
SYN Flood的攻击原理 TCP 协议是一个可靠的、面向连接的流协议,由于 TCP 协议是建立在 IP 协议这种面向无连接的协议,所以 TCP 协议必须自己来维护连接的状态 TCP的三次握手过程 建立连接三次握手过程如下: 客户端需要发送一个 SYN包 给服…...
Javaweb数据库多表查询 内连接 外连接 子查询
内连接 外连接 左外连接,左边是全部表 表名,即使没有匹配右边的数据,也要查询出来 子查询 案例 1.没有说所有的部门,所有的员工,用内连接(隐式内连接)...
绕过 RAG 实时检索瓶颈,缓存增强生成(CAG)如何助力性能突破?
编者按: 你是否曾经遇到过这样的困扰:在开发基于 RAG 的应用时,实时检索的延迟让用户体验大打折扣?或者在处理复杂查询时,检索结果的不准确导致回答质量不尽如人意? 在当前大语言模型应用大规模落地的背景下…...
Nginx系列09(Nginx 与其他服务集成、实战项目)
目录 Nginx 与其他服务集成 实战项目 Nginx 与其他服务集成 Nginx 与 Tomcat 集成 概念:将 Nginx 作为前端代理服务器,Tomcat 作为后端应用服务器。Nginx 负责处理静态资源请求、负载均衡以及将动态请求转发给 Tomcat,Tomcat 则专注于运行…...
nvidia驱动更新,centos下安装openwebui+ollama(非docker)
查看centos内核版本 uname -a cat /etc/redhat-release下载对应的程序(这个是linux64位版本通用的) https://cn.download.nvidia.cn/tesla/550.144.03/NVIDIA-Linux-x86_64-550.144.03.run cudnn想办法自己下一下,我这里是12.x和11.x通用的…...
手机端抓包大麦网抢票协议:实现自动抢票与支付
🚀 手机端抓包大麦网抢票协议:实现自动抢票与支付 🚀 🔥 你是否还在为抢不到热门演出票而烦恼?本文将教你如何通过抓包技术获取大麦网抢票协议,并编写脚本实现自动化抢票与支付!🔥 …...
Vue3实现文件上传、下载及预览全流程详解(含完整接口调用)
文章目录 一、环境准备1.1 创建Vue3项目1.2 安装依赖1.3 配置Element Plus 二、文件上传实现2.1 基础上传组件2.2 自定义上传逻辑(Axios实现) 三、文件下载实现3.1 直接下载(已知文件URL)3.2 后端接口下载(二进制流&am…...
普通人高效使用DeepSeek指南?
李升伟 整理 DeepSeek(深度求索)作为一款智能搜索引擎或AI工具,普通人可以通过以下方式高效利用它,提升学习、工作和生活效率: --- ### **一、基础功能:精准搜索** 1. **明确需求提问** 用自然语言…...
基于JAVA+Spring+mysql_快递管理系统源码+设计文档
文末获取源码数据库文档 感兴趣的可以先收藏,有毕设问题,项目以及论文撰写等问题都可以和博主沟通,尽最大努力帮助更多的人! 摘 要 随着物流行业信息化的深入使得物流过程中货物的状态和变化透明化,现代信息化的接入使…...
《从0到1:用Python在鸿蒙系统开发安防图像分类AI功能》
在人工智能与移动应用深度融合的当下,类目标签AI功能成为众多行业提升效率和用户体验的关键技术。本文聚焦于HarmonyOS NEXT API 12及以上版本,以图像分类在智能家居安防领域的应用为例,为开发者详细阐述如何利用Python开发类目标签AI功能,助力鸿蒙技术在该领域的创新应用。…...
MoE-GPS框架:动态专家复制的负载均衡优化策略
1. MoE-GPS框架解析:动态专家复制的预测策略指南在大型语言模型(LLM)的实际部署中,混合专家(Mixture-of-Experts, MoE)架构通过动态激活专家子集显著降低了计算开销。然而,多GPU环境下的专家负载…...
Herqles架构:量子比特读取的硬件高效判别器设计与FPGA实现
1. 项目概述:量子比特读取的精度与速度困局在量子计算的世界里,有一个操作看似基础,却直接决定了整个系统的上限:量子比特的读取。你可以把它想象成计算机的“内存读取”指令,但这里读取的不是0或1的确定性电压&#x…...
BepInEx配置管理器完整指南:一键管理所有游戏模组设置
BepInEx配置管理器完整指南:一键管理所有游戏模组设置 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否厌倦了为每个游戏模组单…...
Meta裁了8000人,员工拖着行李箱抢可乐
昨天凌晨4点,Meta很多员工的邮箱同时响了。是裁员邮件。这一次,Meta裁掉了全球约10%的员工,规模大约8000人。分手大礼包:16周基础薪资 每满1年工龄额外2周薪资 18个月全家医保。真正让硅谷炸锅的,反而是裁员前几天&a…...
潜变量扩散模型原理解析:从宝可梦生成看LDM工程落地
1. 项目概述:用宝可梦讲清楚潜变量扩散模型,不是比喻游戏,是真能跑通的原理复现你有没有试过让AI画一只“皮卡丘和喷火龙杂交出来的电火属性神兽”?不是简单拼贴,而是真正理解“电系的毛发质感火系的鳞片过渡神兽级别的…...
【收藏干货】2026 版大模型推理底层原理拆解!吃透 Prefill/Decode 与 vLLM 核心优化
近两年大模型技术飞速迭代,全面重构了 AI 应用开发体系。日常开发中大家热议模型参数规模、Agent 智能体、多模态交互能力,可真正落地部署上线后,决定产品最终使用体验的核心,往往并非模型本身性能,而是容易被忽略的大…...
新业务新项目的缺陷密度解析
对于新业务、新项目,业界并没有一个放之四海而皆准的“标准答案”。但通过参考行业研究数据,从四个渐进的项目阶段来设定基准,是更务实的做法。📈 测量差异与高层级数据使用KLOC(千行代码)和功能点这两种度…...
Dark Reader终极指南:轻松为任何网站开启完美深色模式
Dark Reader终极指南:轻松为任何网站开启完美深色模式 【免费下载链接】darkreader Dark Reader Chrome and Firefox extension 项目地址: https://gitcode.com/gh_mirrors/da/darkreader Dark Reader是一款广受欢迎的浏览器扩展,它能智能分析网页…...
CPU压力测试
工具环境:python3运行环境:SOC端内部测试用途:给SOC的CPU单个核以及MEM加压文件说明以及主要用法:""" CPU Loader """import os import sys import time import math import signal import argpars…...
一句指令就能完成跨系统操作?——2026企业级智能体技术路径深度拆解
站在2026年的时间节点回望,企业数字化转型已从“流程驱动”全面转向“智能体驱动”。过去,跨系统操作往往意味着繁杂的API对接或编写脆弱的自动化脚本。而今,以实在智能推出的实在Agent为代表的方案,实现了“一句指令,…...
