Java和Spring的六边形架构:在代码中体现“六角形建筑”
前言:
术语“六角形建筑”已经存在很长时间了。足够长的时间,这个主题的主要资源已经脱机了一段时间,并且直到最近才从档案中解救出来。但是,我发现关于如何以这种体系结构样式实际实现应用程序的资源很少。本文的目的是提供一种用Java和Spring以六边形样式实现Web应用程序的自以为是的方式。
什么是“六角形建筑”?
与常见的分层体系结构样式相反,“六角形体系结构”的主要特征是组件之间的依赖关系“指向内部”,指向我们的领域对象:
六边形只是一种描述应用程序核心的奇特方法,该应用程序由领域对象,在其上操作的用例以及为外界提供接口的输入和输出端口组成。
1、域对象
在具有业务规则的域中,域对象是应用程序的命脉。域对象可以包含状态和行为,行为越接近状态,代码将越容易理解,推理和维护。
域对象没有任何外部依赖性。它们是纯Java,并提供了用于用例的API。
由于域对象不依赖于应用程序的其他层,因此其他层的更改不会影响它们。它们可以不受依赖地演变,这是“单一责任原则”(“ SOLID”中的“ S”)的主要示例,该原则指出组件应该只有一个更改的理由。对于我们的域对象,原因是业务需求的变化。
只需承担一项责任,我们就可以演化域对象,而不必考虑外部依赖关系。这种可扩展性使六角形体系结构样式非常适合在实践域驱动设计时。在开发过程中,我们只是遵循自然的依赖关系流程:我们开始在域对象中进行编码,然后从那里开始,如果不是域驱动的,那么我不知道是什么。
2、用例
我们知道用例是用户使用我们的软件所做的抽象描述。在六角形体系结构样式中,将用例提升为我们代码库的“一等公民”是有意义的。
从这个意义上讲,用例是一个处理特定用例周围所有内容的类。作为示例,让我们考虑银行应用程序中的用例“将钱从一个帐户发送到另一个帐户”。
我们将创建一个SendMoneyUseCase具有独特API 的类,该API允许用户转移资金。该代码包含特定于用例的所有业务规则验证和逻辑,因此无法在域对象中实现。其他所有内容都委托给域对象(例如,可能存在域对象Account)。
与域对象类似,用例类不依赖于外部组件。当它需要六角形之外的东西时,我们创建一个输出端口。
3、输入和输出端口
域对象和用例在六边形内,即在应用程序的核心内。每次与外部的通信都是通过专用的“端口”进行的。
输入端口是一个简单的接口,可由外部组件调用,并由用例实现。调用此类输入端口的组件称为输入适配器或“驱动”适配器。
输出端口还是一个简单的接口,如果我们的用例需要外部的东西(例如,数据库访问),则可以用它们来调用。该接口旨在满足用例的需求,但由称为输出或“驱动”适配器的外部组件实现。如果您熟悉SOLID原理,则这是依赖关系反转原理(在SOLID中为“ D”
Java和Spring的六边形架构:在代码中体现“六角形建筑”相关推荐
- asm 5 java,java – 使用ASM(5.x)在字节代码中检测运行时的递归方法调用:howto?
问题如下; Java代码中的方法是: Rule foo() { return sequence(foo(), x()); } 这将引发解析循环,当然应该避免;但是,这是合法的: Rule foo() ...
- java 很多if_java 使用策略模式解决代码中包含太多的if else
1.首先创建一个enum枚举类 代码附上: public enum SystemErrorCode { QUIT(":quit", "", "com. ...
- android java 指针,opencv android:向我的代码中添加cascade分类器后出现空指针异常
我在casecadeclassifier.java类中收到空指针异常 在这里: Mat objects_mat = objects; detectMultiScale_4(nativeObj, ima ...
- java中用spring boot连接oracle数据库
java中用spring boot连接oracle数据库 代码下载链接 百度云:https://pan.baidu.com/s/1dU_z2pUS2NSfowI4_mJ4Ow 提取码:mmlm CSD ...
- java多态优化多个if_脑壳疼!代码中那么多“烦人”的if else
if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼. 图片来自 Pexels 例如下面这个伪代码: 是不是很崩溃?虽然他是伪代码,并且看起来也 ...
- 怎样优化代码中那么多的if else
if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼. 例如下面这个伪代码: 是不是很崩溃?虽然他是伪代码,并且看起来也很夸张,但在现实中,当我 ...
- java 云架构_java版Spring Cloud云架构代码结构构建
本篇我们根据架构图进行代码的构建.根据微服务化设计思想,结合spring cloud一些优秀的项目,如服务发现.治理.配置化管理.路由负载.安全控制等优秀解决方案,使用Maven技术将框架进行模块化. ...
- java打印一个空心六边形_六边形架构 Java 实现
六边形架构是一种设计风格,经过分层实现核心逻辑与外部对象隔离.其核心逻辑是业务模块,外部元素是整合点,好比数据库.外部 API.界面等.它将软件分为内部与外部,内部包含了核心业务逻辑与领域层(所谓分层 ...
- 六边形算法java_六边形架构 Java 实现
(给ImportNew加星标,提高Java技能) 编译:唐尤华 链接:shipilev.net/jvm-anatomy-park/2-transparent-huge-pages/ 六边形架构是一种设 ...
最新文章
- 小米 android 刷4.0,小米如何刷MIUI4.0系统教程
- 改变Android ProgressBar样式颜色
- c++求平均值_云顶之弈S4:六射手娱乐吃鸡!人均刮痧王,每个人都是主C
- 把Sql数据转换为业务数据的几种方法
- 2.3 线性变换引入
- PHP获取input中的值相同报错,laravel单元测试之phpUnit中old()函数报错解决_php实例...
- C++:数字逆向输出
- 【Vue2.0】—github小案例(二十三)
- 四川大学计算机专业调剂,2019四川大学计算机学院考研调剂信息(第二批)
- 游戏挂机计算机自己保护怎么办,游戏中遇到玩家挂机该如何应对?做好这5件事可以降低输的机率...
- [4.6]-AutoSAR零基础学习-CAN通信协议
- mt管理器小白破解之路-基础篇第一课
- Scrapy网络爬虫系统
- 禁不住诱惑?不可描述的应用之下暗藏巨大风险
- 外汇交易提醒 ,美元升势停不下来?
- LSD(线段检测测试文件)
- python网易云收费_小白都能学会的Python爬虫网易云音乐
- Visual Studio2022快速生成函数说明文档
- 【nlp学习】中文命名实体识别(待补充)
- 计算图像每行占用的字节数
热门文章
- “数字化医疗新利器!呼析宝电子听诊器携AI智能助力远程诊断“
- volatile适用场合
- Java发送邮箱——QQ邮箱
- java编译找不到符号_编译java代码时报错找不到符号
- 恢复Windows照片查看器
- 向量和矩阵的 1范数、2范数
- 亚马逊、Reddit及Mozilla等公司下个月将举行“网络中立”抗议活动
- 荣耀x30i和x20对比
- k均值聚类算法考试例题_KMeans (K均值)算法讲解及实现
- 华为FreeBuds 5降噪好不好?