spring-boot 代码使用DDD结构并使用archunit单元测试看护架构

简单理解DDD,了解有关DDD+springboot的目录架构 由于领导的突然下发任务,一个新人菜鸡被捉去总结包和类的作用了,在总结的时候,表示不知道那些包究竟 是干什么用的,所以我。。。从他口中所说的应用层、领域层、和基础设施层找出了原来他使用DDD,所以就查资料啦~记录一下搜集的资料 资料搜集 关于ddd+springboot的例子 https://gitee.com/wxpcode123/ddd-sample/tree/master 一个微服务+DDD(领域驱动设计)的代码结构示例 hthttps://blog.youkuaiyun.com/weixin_30347009/a 阅读详情

代码结构

└───com.example.demo
             ├───api
             │   └───controller
             ├───application
             │   ├───configuration
             │   │   ├───event
             │   │   └───listener
             │   └───service
             │       └───impl
             ├───domain
             │   ├───entity
             │   ├───repository
             │   │   └───dao
             │   └───service
             └───infrastructure
                 ├───entity
                 ├───enums
                 ├───exception
                 └───utils

架构看护

使用archunit的单元测试看护代码结构:

引入依赖:

<dependency>
    <groupId>com.tngtech.archunit</groupId>
    <artifactId>archunit-junit5</artifactId>
    <version>${archunit.version}</version>
    <scope>test</scope>
</dependency>

单元测试代码:

package com.example.demo;

import com.tngtech.archunit.core.importer.ImportOption;
import com.tngtech.archunit.junit.AnalyzeClasses;
import com.tngtech.archunit.junit.ArchTest;
import com.tngtech.archunit.lang.ArchRule;

import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
import static com.tngtech.archunit.library.Architectures.layeredArchitecture;

/**
 * @author youngbear
 * @email youngbear@aliyun.com
 * @date 2025-04-14 23:21
 * @blog <a href="https://blog.youkuaiyun.com/next_second">...</a>
 * @github <a href="https://github.com/YoungBear">...</a>
 * @description ddd 代码架构看护类
 */
@AnalyzeClasses(packages = "com.example.demo", importOptions = {ImportOption.DoNotIncludeTests.class})
public class CodeGuardArchTest {
    /**
     * infrastructure 不能被其他包引用(常用于不同领域之间的依赖看护)
     */
    @ArchTest
    static final ArchRule infrastructure_should_not_depend_on_others = noClasses().that()
            .resideInAPackage("..infrastructure..")
            .should()
            .dependOnClassesThat()
            .resideInAnyPackage("..application..", "..domain..", "..api..");

    /**
     * 代码分层依赖看护
     */
    @ArchTest
    static final ArchRule codeLayeredArchTest = layeredArchitecture().consideringAllDependencies()
            // 定义 interface 层
            .layer("api").definedBy("com.example.demo..api..")
            // 定义 application 层
            .layer("application").definedBy("com.example.demo..application..")
            // 定义 domain 层
            .layer("domain").definedBy("com.example.demo..domain..")
            // 定义 infrastructure 层
            .layer("infrastructure").definedBy("com.example.demo..infrastructure..")
            // api 层不能被其他层依赖
            .whereLayer("api").mayNotBeAccessedByAnyLayer()
            // application 层只能被 api 层依赖
            .whereLayer("application").mayOnlyBeAccessedByLayers("api")
            // domain 层只能被 api application 层依赖
            .whereLayer("domain").mayOnlyBeAccessedByLayers("api", "application");
}

源代码地址

Spring Boot三层架构实战:从Controller-Service-Dao到DDD分层设计 分层架构是软件工程中实现关注点分离的核心设计模式,通过将系统划分为表现层、业务逻辑层和数据访问层等不同层次,有效降低了模块间的耦合度。其原理在于明确各层的职责边界,规定单向依赖关系,从而提升代码的可读性、可维护性和可测试性。这种架构的技术价值在于能够应对需求变更,便于团队协作,并支持技术栈的平滑替换。在Web应用开发领域,分层架构是构建健壮后台系统的基石,尤其适用于企业级管理系统和复杂业务平台。本文以Spring Boot框架为基础,结合用户管理模块的完整代码示例,详细演示了如何从零搭建一个清晰的三层架构项 阅读详情

相关推荐

ArchUnit实战:Java架构守护与依赖治理

在软件工程中,架构腐化是长期项目面临的普遍挑战,通常由无数微小的妥协累积而成,导致代码依赖混乱、维护成本剧增。其核心原理在于代码结构的静态依赖关系失控,使得系统难以演进。为了解决这一问题,架构守护技术应运而生,它通过自动化检查代码结构规则,确保架构一致性。技术价值在于将架构规范从文档转化为可执行的测试,在持续集成流程中提前拦截违规代码,有效防止技术债务积累。应用场景广泛,特别适合采用分层架构、领域驱动设计或微服务架构的中大型Java项目。本文聚焦ArchUnit这一基于JUnit的架构测试库,它通过字节码分

weixin_33725126的博客 361

SpringBoot-DDD领域驱动设计的概念

SpringBoot-DDD领域驱动设计的概念 大家都知道软件开发不是一蹴而就的事情,我们不可能在不了解产品(或行业领域)的前提下进行软件开发,在开发前通常需要进行大量的业务知识梳理,然后才能到软件设计的层面,最后才是开发。而在业务知识梳理的过程中,必然会形成某个领域知识,根据领域知识来一步步驱动软件设计,就是领域驱动设计(DDD,Domain-Driven Design)的基本概念 。 为什么需要 DDD 在业务初期,功能大都非常简单,普通的 CRUD 就基本能满足要求,此时系统是清晰的。但随着产品的不断

weixin_45203607的博客 6672

软件架构分层实践:从职责边界到代码落地的清晰指南

在软件工程中,分层架构是一种基础且核心的设计思想,旨在通过分离关注点来降低系统复杂性。其核心原理是定义清晰的职责边界与单向稳定的依赖关系,例如经典的三层架构(表现层、业务逻辑层、数据访问层)。这种设计的技术价值在于提升代码的可维护性、可测试性与团队协作效率,是实现高内聚、低耦合系统的关键。在实际应用场景中,无论是构建Spring Boot后端Web应用、管理前端复杂状态,还是设计微服务,都需要将分层的概念转化为具体的工程实践。本文聚焦于如何避免分层失效的常见陷阱,例如Service层臃肿或循环依赖,并探讨通

weixin_33889665的博客 613

jMolecules实战指南:用注解构建清晰可维护的领域驱动设计架构

在当今复杂的企业应用开发中,如何让代码清晰地表达业务领域概念,同时保持架构的整洁性和可维护性,是每个开发团队面临的挑战。jMolecules项目正是为了解决这一问题而生——它提供了一套完整的Java注解库,帮助开发者在代码中直接表达架构抽象和领域驱动设计(DDD)概念,从而构建出更加健壮、可读性更强的业务系统。 ## 🔍 问题场景:领域概念与技术实现混为一谈 传统Java开发中,我们经常面临

gitblog_00502的博客 639

AI Agent时代后端工程师价值重构:从代码生成到系统架构与平台建设

在软件工程领域,自动化代码生成与AI辅助开发正成为提升研发效能的关键技术。其核心原理在于利用大型语言模型对结构化任务进行模式识别与代码合成,通过精准的上下文描述(Prompt工程)实现需求到代码的转换。这一技术的工程价值在于将开发者从重复性编码工作中解放,显著提升基础功能的交付速度。在实际应用场景中,AI Agent可高效处理依赖升级、样板代码生成等模式化任务,但更关键的是推动工程师角色向更高维度演进。本文聚焦后端开发领域,探讨当AI Agent能够批量生成Pull Request时,工程师如何构建不可替代

weixin_30698297的博客 299

从0到1,Spring Boot遇上DDD:构建复杂业务系统的5大魔法秘籍?

Spring Boot与DDD的结合,如同春日里的筑梦师与魔法画笔,共同创造了一个既符合业务逻辑又易于维护的复杂系统世界。城堡在他们的共同努力下,不仅坚固耐用,而且美轮美奂,每一砖每一瓦都承载着业务的智慧与梦想。现在,你准备好成为下一个春日筑梦师,用Spring Boot和DDD绘制你的业务梦境吗?

java专栏 631

可验证领域模型:四支柱实现DDD稳定扩展

领域驱动设计(DDD)是复杂业务系统建模的常用方法,但不少团队在落地时遇到模型与代码脱节、业务规则散落、依赖方向失控等难题。其根源在于领域模型缺乏可验证性——无法确认模型是否正确、是否被破坏、是否发生漂移。可验证性要求模型结构清晰、业务不变量可执行、行为可测试、演化可监控,这是保障模型稳定扩展的前提。通过规则显式化、架构守护自动化(如ArchUnit)、领域行为测试化和模型巡检可视化,可以在工程实践中建立持续验证闭环。该思路适用于中台架构建设、遗留系统改造和新项目建模,让领域模型真正成为可依赖的业务逻辑容器

weixin_33906657的博客 383

Spring Boot + DDD 分层架构项目实战

本文还有配套的精品资源,点击获取 简介:Spring Boot 和领域驱动设计(DDD)结合,可构建高效分层架构。本项目示例展示了基础设施层、应用服务层、领域层、接口适配器层等组件的实现,并涵盖了实体、值对象、聚合根、领域事件等核心概念。通过 Spring Data JPA 和 Spring 框架注解,可实现各层间的依赖注入和解耦。本项目提供了一个实践机会,帮助理解 Spr...

weixin_36123300的博客 2159

六边形架构深度解析:端口适配器、依赖倒置与测试友好设计

摘要:本文剖析了六边形架构如何通过端口适配器模式和依赖倒置原则解决传统分层架构的耦合问题。架构核心包含独立领域层(纯Java代码)和双向端口(入站/出站),适配器连接外部系统。关键优势包括:业务逻辑与框架解耦、依赖指向中心、测试友好(可替换Mock适配器)。通过接口定义契约、实现类处理具体交互,六边形架构显著提升了系统的可维护性和可测试性。

瘦到被风吹走的博客 368

spring-ddd:一个使用Spring Boot和DDD提出的分层架构的项目示例

Spring Boot和分层架构

springboot-ddd-demo:如何做好一个项目?springboot与领域模型该如何结合?

如何做好一个后端项目 什么样的项目是一个好的项目,如何做好一个项目?这个问题我考虑过很久,由于之前一直做项目外包,也接触到的了比较多的项目,但是我却从没有感觉到哪一个项目可以让自己感到非常满意,当然做好项目不仅仅单是技术层面的考虑,还需要考虑到与客户的配合、功能的梳理、团队的配合、公司的考核晋升体系等等一系列的问题,我们今天先只从技术层面出发来考虑如何做好一个后端项目。 在我慢慢看清楚领域模型之后,才有了些体会。先说一下我对领域模型的认识:领域模型实际上就是尽可能的引用类去解决问题,而不是函数,也就是朝着面向对象的方向看齐。这样做当然是对的,但却引发了一个新的问题就是如何划分类与类的职责?实际上划分职责的过程就是领域设计的过程。 下面是我对软件系统的认识:颗粒度越大(函数方法代码量越多),功能调整的可能性就会越大,出现BUG的可能性也会越大,要时刻想尽一切办法去减小颗粒度,减小颗粒度不是让

业务逻辑循环依赖:识别、解耦与重构反模式代码的完整指南

在软件工程中,循环依赖是一种常见的反模式,指模块间相互引用导致编译或初始化问题。其原理在于模块间耦合度过高,破坏了系统的分层与边界。这种设计会引发严重的**技术债务**,导致系统难以维护和扩展。从技术价值看,解耦循环依赖能提升代码的可读性、可测试性和系统的可维护性,是构建健壮软件架构的基础。在**微服务架构**和复杂业务系统中,循环依赖尤为常见,例如订单与库存服务间的相互调用,容易形成“业务逻辑循环依赖”。本文通过一个典型电商案例,深入剖析如何运用依赖倒置、事件驱动和领域驱动设计等**架构设计**原则,从代

weixin_30613727的博客 313

三菱 FX5U PLC 4轴程序 控制松下伺服3个, 步进电机一个

三菱 FX5U PLC 4轴程序。 控制松下伺服3个, 步进电机一个, 四轴自动堆垛码垛设备程序, 回原点动作用专用的原点回归指令写的, 手动运行用三菱相对定位指令写的 , 自动运行用绝对定位指令写的取料运行, 表格定位写的自动放料运行, 设备各种报警异常都有写出 程序每一步都有注释。 包括PLC程序、显控触摸屏 程序、松下伺服驱动器接线图。 程序内都有IO注释 编号:4816635519484681汇美0808 ...

m0_68069172的博客 3381

从Devin看AI编程工程化:超越代码生成,实现自主提交的架构秘籍

在软件工程领域,AI辅助编程正从简单的代码补全向深度工程化协作演进。其核心原理在于,通过项目级上下文感知、原子化任务分解与自动化验证工作流,将一次性的代码生成转化为稳定、可追溯的工程资产。这一转变的技术价值在于,它能系统性地解决代码规范一致性、依赖管理、测试验证等工程难题,从而显著提升代码质量和开发效率。在实际应用场景中,无论是微服务架构还是前端应用,开发者都需要引导AI理解项目结构、编码规范与架构约束,使其从“代码生成器”升级为“工程协作者”。本文以Devin的“80%自主提交率”为切入点,深入探讨了如何

weixin_34101784的博客 601

别再为OpenBCI_GUI安装发愁了!保姆级教程带你从Processing配置到成功运行(附常见错误解决)

本文提供了一份详细的OpenBCI_GUI安装教程,涵盖从Processing配置到成功运行的全过程,特别针对常见错误提供了解决方案。通过环境搭建、软件依赖安装、源码处理及首次运行实战,帮助用户高效完成数据可视化工具的部署与使用。

weixin_28366475的博客 270

Claude Code教程(二) | Claude Code 核心信息与使用指南

Claude Code 核心信息与使用指南

qq_20236937的博客 2186

AI生成代码的技术债管理:隐患与解决方案

在软件开发中,技术债是指为了快速实现功能而牺牲代码质量所积累的问题。随着AI代码生成工具的普及,技术债呈现出新的特征:架构一致性缺失、测试覆盖率幻觉和依赖管理失控等。这些问题的根源在于AI生成的代码往往缺乏上下文一致性和深度测试验证。有效的解决方案包括建立AI代码准入门槛、实施增强型测试策略和构建知识传承体系。通过引入ArchUnit测试、变异测试和活文档等工程实践,可以显著降低技术债的积累速度。对于使用GPT类工具的开发团队,特别需要注意Prompt工程规范和代码审查流程的优化,以确保AI生成代码的质量可

cumo7370的博客 1190

OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南——OpenClaw的赚钱底层逻辑与“记忆”革命

AI 的商业价值不在于替代思考,而在于沉淀关系。当 Agent 记住你的偏好、你的历史、你的目标,它就不再是冷冰冰的软件,而是成为数字化的关系资产。这种资产的稀缺性不在于技术复杂度,而在于时间无法被压缩——你无法用更好的算法替代 3 个月的协作记忆。在这场“记忆革命”中,护城河不是模型参数,而是用户与 AI 共同书写的历史。OpenClaw 用一套优雅的文件系统架构,将这种历史转化为可积累、可复用、可变现的数字资产。从“计算即服务”(CaaS)到“记忆即服务”(MaaS)。

冯·诺依曼 1346

系统演进深水区:从单体架构到服务化重塑的实战指南

在软件系统演进过程中,当业务复杂度增长到一定阶段,系统往往会进入一个被称为“深水区”的状态。这通常表现为技术债务累积、架构腐化、开发效率低下和线上稳定性风险加剧。其核心原理在于,早期设计的单体架构或紧耦合的模块化设计,难以应对业务快速迭代和团队规模扩张带来的挑战。从技术价值看,通过系统性的架构重塑,可以提升系统的可维护性、可扩展性和团队交付效率,是支撑业务长期创新的基础设施保障。常见的应用场景包括核心电商系统、金融交易平台、大型企业应用等,当它们面临需求交付周期长、线上故障频发、团队协作效率瓶颈时,就需要进

weixin_30896511的博客 294

回声消除AEC初探

那段保留即可——在播放期间把麦克风关闭(软件层面的 mute),同样能根除回声,只是会失去“一句话期间仍能捕获背景噪声”的能力。如果还有更细节的需求(比如多语言 TTS、实时流式 ASR),欢迎继续交流。的完整示例,可直接拷贝、改造、集成到你现有的 LLM‑TTS 对话系统中。实际效果取决于用户设备的硬件与驱动,若仍有回声,可让用户佩戴。把扬声器信号(把播放音频拷贝给 AEC)从麦克风流中减去。:TTS 播放的声音被同一个麦克风再次捕获,导致声学回声。三种实现示例,帮助你快速落地。,几乎可以消除所有回声。

NLP与推荐算法 571

【信息系统项目管理师】第1章:信息化发展 考点梳理

本文主要详细梳理高项:信息化、新型基础设施建设、两化融合、数字中国、数字化转型与元宇宙等内容。

数据知道的博客 8589

AI代码生成引发的技术债务危机:识别、预防与应对策略

在软件工程领域,技术债务是长期影响项目可维护性与开发效率的核心挑战。其原理在于,为了短期快速交付而牺牲代码质量,会累积未来必须偿还的“利息”,导致系统复杂度攀升、修改成本激增。随着AI编程助手的大规模应用,这一经典问题正以新的形态加速涌现。AI模型基于海量历史代码训练,擅长生成功能正确的代码,但其优化目标通常缺乏对可维护性、架构一致性和团队规范的考量,从而在无形中制造了大量“隐形债务”。这在实际工程中表现为代码风格混乱、过度工程、逻辑正确但难以理解的“代码异味”,最终汇聚成难以维护的“代码库”。为应对这一挑

weixin_33782386的博客 286

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | YOLO26引入FDConv频率动态卷积改进,含FDC3k2二次创新,小目标检测,能够捕捉更加丰富和复杂的特征信息

本文提出了一种频率动态卷积(FDConv)模块,用于改进YOLO26目标检测模型的性能。FDConv通过在傅里叶域内划分参数预算,构建具有频率多样性的权重,有效提升了模型对低频和高频信息的处理能力。该模块包含内核空间调制(KSM)和频率带调制(FBM)两个关键组件,分别实现空间级和频域级的动态调节。实验表明,FDConv仅增加3.6M参数就能超越其他需要大幅增加参数的方法,并在目标检测、实例分割等任务中表现优异。文章详细介绍了FDConv的原理、实现方法及在YOLO26中的集成方式,提供了完整的代码实现。

Ai缝合怪、助力小伙伴高效发论文 250

终极Java开发者指南:精选框架与库完整清单

Java作为全球最流行的编程语言之一,拥有庞大而丰富的生态系统。对于新手和有经验的开发者来说,找到最适合的工具和框架往往是一项挑战。本文将为您呈现一份精心整理的Java生态系统精选清单,帮助您快速掌握Java开发的核心工具和最佳实践。 ## 为什么需要Java精选资源库? 在Java开发的世界里,每天都有新的框架和库诞生,而旧的项目也在不断更新。面对如此庞大的选择,开发者常常会感到困惑:哪个O

gitblog_00224的博客 243

Loop Engineering 来了:从写 Prompt 到设计 Loop,AI 编程的第四次范式跃迁

文章摘要: Loop Engineering是AI编程领域的新范式,标志着从"人手动喂指令"到"设计自驱动循环"的跃迁。其核心在于通过五个组件(定时器、工作空间、知识体系、连接器和子Agent验证)构建自动化任务流,使AI系统能自主运行。这一概念的火爆源于模型能力和工具链的成熟,使得任务设计成为关键瓶颈。作者指出,从Prompt到Loop的四次范式跃迁(语言学→信息科学→控制论→管理学)反映了人机协作关系的根本变化:人类角色从执行者逐渐退居为目标设定者。落地Loop Engineering的真正挑战在于目标

少说,多做 330

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: CyclicBarrier 基本用法
下一篇: Java版本对应关系表
杨小熊的笔记
博客等级 码龄15年 125粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值