JAVA如何输出六角形,浅谈 Java 六边形架构
原标题:浅谈 Java 六边形架构
dzone.com/articles/demonstration-of-hexagonal-architecture-in-java
六边形架构首先是一种设计模式,设计的初衷是解决实际问题。当应用程序与 UI、测试环境、数据库、外部 API 等依赖项进行交互时,通常会遇到一些问题。六边形架构的作用就是解耦,把核心逻辑与不需要的依赖进行隔离。
1. 什么是六边形架构
Alistair Cockburn 博士最早提出了六边形架构这个概念。他把应用程序设想为一个六边形的封闭主体,任何与核心逻辑相关的部分都位于六边形中,其余都分散在外面。通过这种方式,测试核心逻辑变得很容易,不用担心过多的外部因素。
2. 如何实现六边形架构
六边形的内外部分通过所谓的“端口(Port)和适配器(Adapter)”进行双向交互。在应用程序中,interface 作为端口。接口的实现作为适配器,通过适配器在端口之间建立通信。
3. 示例
下面举一个杂货店例子,核心业务逻辑在 `GroceryStoreService` 中。有一个用户正在使用杂货店服务,需要以下基本功能:
Controller 层充当适配器,通过端口(interface)适配器与应用内部通信。
```java
/**
* Controller 层充当适配器, 与应用程序的端口进行通信
*/
@RestController
publicclassGroceryStoreControllerAdapter {
// Spring 会解析 Service Bean, 由 Service Bean 处理核心业务逻辑
@Autowired
GroceryStoreServicePort groceryStoreService;
@PostMapping(value = "/add/{itemId}")
publicvoidaddItem(@RequestParam Long itemId){
groceryStoreService.addItem(itemId);
}
@DeleteMapping( "/delete/{itemId}")
publicvoiddeleteItem(@RequestParam Long itemId){
groceryStoreService.deleteItem(itemId);
}
@GetMapping( "/fetch/all/items")
publicvoidfetchAllItems{
groceryStoreService.fetchAllItems;
}
}
```
接下来,定义应用程序端口 `GroceryStoreServicePort`,如下所示:
```java
/**
* 此接口作为应用程序端口
*/
publicinterface GroceryStoreServicePort {
// 端口: 根据指定 id 添加商品
voidaddItem(Long itemId);
// 端口: 根据指定 id 删除商品
voiddeleteItem(Long itemId);
// 端口: 获取所有已添加的商品
voidfetchAllItems;
}
```
上面代码中用 `Adapter` 进行命名,可以推测采用了 interface 方式与应用进行通信。可以更进一步为端口提供实现层,处理整个应用的业务逻辑。下面通过 `GroceryStoreServicePortImpl` 作为示例实现。
```java
/**
* 核心业务逻辑实现
*/
publicclassGroceryStoreServicePortAdapter implements GroceryStoreServicePort {
/**
* Spring 对 repo 进行解析, 作为数据库通信的端口
*/
@Autowired
GroceryStoreRepositoryPort groceryStoreRepositoryPort;
@ Override
publicvoidaddItem(Long itemId){
GroceryCart groceryCart = newGroceryCart;
// 使用标准协议,比如构造函数、setter 等设置值
// 使用 repo 端口把实例持久化到数据库
groceryStoreRepositoryPort.save(groceryCart);
}
@ Override
publicvoiddeleteItem(Long itemId)
{
Optional groceryCartInstance = groceryStoreRepositoryPort.findById(itemId);
// helper 代码
groceryStoreRepositoryPort. delete(cart);
}
@ Override publicvoidfetchAllItems
{
// 使用 repo 端口从数据库获取所有商品
Iterable groceryList = groceryStoreRepositoryPort.findAll;
// 迭代获取所有商品 {...}
}
}
```
最后在应用程序中提供 repository 层,以便能够与数据库进行通信。通过另一个端口 `GroceryStoreRepositoryPort` 实现:
```java
importentities.GroceryCart;
importorg.springframework.data.repository.CrudRepository;
importorg.springframework.stereotype.Repository;
@Repository
publicinterface GroceryStoreRepositoryPort extends CrudRepository {}
```
4. 结论
Java 六边形架构提供一种有效的解耦方法,通过“端口-适配器”的形式把核心逻辑与其他依赖进行了简单高效地隔离。返回搜狐,查看更多
责任编辑:
JAVA如何输出六角形,浅谈 Java 六边形架构相关推荐
- 00005在java结果输出_浅谈Java反序列化漏洞原理(案例未完善后续补充)
摘要: 0005,这个16进制流基本上也意味者java反序列化的开始:(2)HTTP:必有rO0AB,其实这就是aced0005的base64编码的结果:以上意味着存在Java反序列化,可尝试构造pa ...
- java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...
浅谈java的byte数组的不同写法 (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"b ...
- java同名函数_浅谈Java 继承接口同名函数问题
在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...
- java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...
Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str ...
- java 字符串转list_浅谈java 字符串,字符数组,list间的转化
1.关于java.lang.string.split xxx.split()方法可以将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.字符串转字符数组 String str =" ...
- java对象头_浅谈java对象结构 对象头 Markword
概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ----- ...
- java bitset用途_浅谈Java BitSet使用场景和代码示例
搜索热词 @H_502_0@一.什么是BitSet? @H_502_0@ 注:以下内容来自JDK API: @H_502_0@ BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个b ...
- java 多线程同步_浅谈Java多线程(状态、同步等)
Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...
- java手动回收_浅谈java是如何做资源回收补救的
学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...
最新文章
- java多附件上传 实例demo
- 《计算机组成原理》课程设计任务书——TEC-2实验系统——微程序设计
- C#方法重载(overload)方法重写(override)隐藏(new)
- SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation要点
- 送书 | 一本针对零基础 AI 学习的书:Python入门到人工智能实战
- 中python执行shell_IPython,在探索中学习编程
- java面试要点---ibatiS框架的使用方法介绍---随时更新
- 1433 mssql 安全_mssqlsql2008安全配置又一给力教程
- 区块链 链上脚本、智能合约和Dapp的关系区别
- OpenCV-特征提取与检测(03、自定义角点检测器)
- 三菱a系列motion软体_三菱MDSDMSPV3系列连接接口说明
- 有道词典Chrome划词插件
- python画图-python绘图入门(完整版)
- 阿里巴巴推进中国中产阶级奢侈消费
- Springboot实战:项目部署
- 我写了一个微信排版编辑器(已开源)
- pdf解密工具(超实用)
- HTTP ---code错误状态码大全
- 【大学物理·恒定电流的磁场】磁感应强度
- 对话祁隆《借我星光》作词人温暖:已获知和合国际收购信息
热门文章
- 抽象、低内聚、难变更,你还在用“堆栈”组织代码?
- 50个爱心图案PS笔刷
- 安装win10时关闭计算机,安装win10后,我关闭了这几个功能,电脑好用太多了!...
- html5用canvas画小黄人
- 动画笔记1----iclone工具栏基本操作
- C# 微信支付APIv3 SDK RSAUtility
- 内部排序算法的实现(插入排序、选择排序、交换排序、归并排序、计数排序)
- 2020年大学计算机一级报名时间,2020年上半年全国计算机等级考试报名开始了!!!...
- 桌子做3D建模需要多长时间?
- cascade自己训练级联分类器(人脸检测)