原标题:浅谈 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 六边形架构相关推荐

  1. 00005在java结果输出_浅谈Java反序列化漏洞原理(案例未完善后续补充)

    摘要: 0005,这个16进制流基本上也意味者java反序列化的开始:(2)HTTP:必有rO0AB,其实这就是aced0005的base64编码的结果:以上意味着存在Java反序列化,可尝试构造pa ...

  2. java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...

    浅谈java的byte数组的不同写法 (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"b ...

  3. java同名函数_浅谈Java 继承接口同名函数问题

    在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样? 动手做实验: interface A{ void fun(); } interface B{ void fun(); ...

  4. java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str ...

  5. java 字符串转list_浅谈java 字符串,字符数组,list间的转化

    1.关于java.lang.string.split xxx.split()方法可以将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.字符串转字符数组 String str =" ...

  6. java对象头_浅谈java对象结构 对象头 Markword

    概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ----- ...

  7. java bitset用途_浅谈Java BitSet使用场景和代码示例

    搜索热词 @H_502_0@一.什么是BitSet? @H_502_0@ 注:以下内容来自JDK API: @H_502_0@ BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个b ...

  8. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  9. java手动回收_浅谈java是如何做资源回收补救的

    学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...

最新文章

  1. java多附件上传 实例demo
  2. 《计算机组成原理》课程设计任务书——TEC-2实验系统——微程序设计
  3. C#方法重载(overload)方法重写(override)隐藏(new)
  4. SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation要点
  5. 送书 | 一本针对零基础 AI 学习的书:Python入门到人工智能实战
  6. 中python执行shell_IPython,在探索中学习编程
  7. java面试要点---ibatiS框架的使用方法介绍---随时更新
  8. 1433 mssql 安全_mssqlsql2008安全配置又一给力教程
  9. 区块链 链上脚本、智能合约和Dapp的关系区别
  10. OpenCV-特征提取与检测(03、自定义角点检测器)
  11. 三菱a系列motion软体_三菱MDSDMSPV3系列连接接口说明
  12. 有道词典Chrome划词插件
  13. python画图-python绘图入门(完整版)
  14. 阿里巴巴推进中国中产阶级奢侈消费
  15. Springboot实战:项目部署
  16. 我写了一个微信排版编辑器(已开源)
  17. pdf解密工具(超实用)
  18. HTTP ---code错误状态码大全
  19. 【大学物理·恒定电流的磁场】磁感应强度
  20. 对话祁隆《借我星光》作词人温暖:已获知和合国际收购信息

热门文章

  1. 抽象、低内聚、难变更,你还在用“堆栈”组织代码?
  2. 50个爱心图案PS笔刷
  3. 安装win10时关闭计算机,安装win10后,我关闭了这几个功能,电脑好用太多了!...
  4. html5用canvas画小黄人
  5. 动画笔记1----iclone工具栏基本操作
  6. C# 微信支付APIv3 SDK RSAUtility
  7. 内部排序算法的实现(插入排序、选择排序、交换排序、归并排序、计数排序)
  8. 2020年大学计算机一级报名时间,2020年上半年全国计算机等级考试报名开始了!!!...
  9. 桌子做3D建模需要多长时间?
  10. cascade自己训练级联分类器(人脸检测)