浅谈 Java 六边形架构
2021/5/30 12:21:37
本文主要是介绍浅谈 Java 六边形架构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
六边形架构首先是一种设计模式,设计的初衷是解决实际问题。当应用程序与 UI、测试环境、数据库、外部 API 等依赖项进行交互时,通常会遇到一些问题。六边形架构的作用就是解耦,把核心逻辑与不需要的依赖进行隔离。
1. 什么是六边形架构
Alistair Cockburn 博士最早提出了六边形架构这个概念。他把应用程序设想为一个六边形的封闭主体,任何与核心逻辑相关的部分都位于六边形中,其余都分散在外面。通过这种方式,测试核心逻辑变得很容易,不用担心过多的外部因素。
2. 如何实现六边形架构
六边形的内外部分通过所谓的“端口(Port)和适配器(Adapter)”进行双向交互。在应用程序中,interface 作为端口。接口的实现作为适配器,通过适配器在端口之间建立通信。
3. 示例
下面举一个杂货店例子,核心业务逻辑在 `GroceryStoreService` 中。有一个用户正在使用杂货店服务,需要以下基本功能:
添加商品到购物车
删除指定商品
查看购物车中已添加的商品
Controller 层充当适配器,通过端口(interface)适配器与应用内部通信。
```java /** * Controller 层充当适配器, 与应用程序的端口进行通信 */ @RestController public class GroceryStoreControllerAdapter { // Spring 会解析 Service Bean, 由 Service Bean 处理核心业务逻辑 @Autowired GroceryStoreServicePort groceryStoreService; @PostMapping(value = "/add/{itemId}") public void addItem(@RequestParam Long itemId){ groceryStoreService.addItem(itemId); } @DeleteMapping("/delete/{itemId}") public void deleteItem(@RequestParam Long itemId){ groceryStoreService.deleteItem(itemId); } @GetMapping("/fetch/all/items") public void fetchAllItems(){ groceryStoreService.fetchAllItems(); } } ```
接下来,定义应用程序端口 `GroceryStoreServicePort`,如下所示:
```java /** * 此接口作为应用程序端口 */ public interface GroceryStoreServicePort { // 端口: 根据指定 id 添加商品 void addItem(Long itemId); // 端口: 根据指定 id 删除商品 void deleteItem(Long itemId); // 端口: 获取所有已添加的商品 void fetchAllItems(); } ```
上面代码中用 `Adapter` 进行命名,可以推测采用了 interface 方式与应用进行通信。可以更进一步为端口提供实现层,处理整个应用的业务逻辑。下面通过 `GroceryStoreServicePortImpl` 作为示例实现。
```java /** * 核心业务逻辑实现 */ public class GroceryStoreServicePortAdapter implements GroceryStoreServicePort { /** * Spring 对 repo 进行解析, 作为数据库通信的端口 */ @Autowired GroceryStoreRepositoryPort groceryStoreRepositoryPort; @Override public void addItem(Long itemId) { GroceryCart groceryCart = new GroceryCart(); // 使用标准协议,比如构造函数、setter 等设置值 // 使用 repo 端口把实例持久化到数据库 groceryStoreRepositoryPort.save(groceryCart); } @Override public void deleteItem(Long itemId) { Optional<GroceryCart> groceryCartInstance = groceryStoreRepositoryPort.findById(itemId); // helper 代码 groceryStoreRepositoryPort.delete(cart); } @Override public void fetchAllItems() { // 使用 repo 端口从数据库获取所有商品 Iterable<GroceryCart> groceryList = groceryStoreRepositoryPort.findAll(); // 迭代获取所有商品 {...} } } ```
最后在应用程序中提供 repository 层,以便能够与数据库进行通信。通过另一个端口 `GroceryStoreRepositoryPort` 实现:
```java import entities.GroceryCart; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @Repository public interface GroceryStoreRepositoryPort extends CrudRepository<GroceryCart, Integer> {} ```
4. 结论
Java 六边形架构提供一种有效的解耦方法,通过“端口-适配器”的形式把核心逻辑与其他依赖进行了简单高效地隔离。
这篇关于浅谈 Java 六边形架构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)