1.概述
在这篇快速的文章中,我们将通过一个实际的例子来讨论Java中的六角结构。
2.什么是六角形建筑?
简而言之,六角结构将软件分为内部组件和外部组件,而不是概念层。
保留在内部的组件通常由应用程序和域层以及核心业务逻辑组成。 而外界的组件则由UI和Database之类的层组成。
内部组件和外部组件之间的连接是通过称为端口的抽象和称为适配器的实现来实现的。
3.好处
- 灵活性-通过不同的适配器,该软件可以服务多个渠道
- 可测试性-模拟代码很容易
- 纯度-核心逻辑保持不变
4. Java的六边形架构
在Java中,接口是端口,实现类是适配器。
让我们创建一个简单的Spring Boot应用程序,并尝试使用Hexagonal Architecture注册/查看Employee详细信息。
首先,我们将创建一个名为Employee的实体。
然后, EmployeeService类保留核心业务逻辑以持久化数据。
在这里, Employee和EmployeeService类是内部组件的一部分。 因此,我们将创建端口以公开它们。
首先,让我们创建EmployeeUIPort接口来与前端进行通信:
public interface EmployeeUIPort {
@PostMapping("register")
public void register(@RequestBody Employee request);
@GetMapping("view/{id}")
public Employee view(@PathVariable Integer id);
}
然后,我们将创建EmployeeDBPort接口以与数据库进行通信:
public interface EmployeeDBPort {
void register(String name);
Employee getEmployee(Integer id);
}
最后,我们需要适配器来连接端口-EmployeeUIPort和EmployeeDBPort 。
让我们创建EmployeeControllerAdapter类,该类实现EmployeeUIPort接口并充当RestController 。 因此,它将充当与前端连接的适配器:
@RestController
@RequestMapping("/employee/")
public class EmployeeControllerAdapter implements EmployeeUIPort {
@Autowired
private EmployeeServiceAdapter employeeService;
@Override
public void register(@RequestBody Employee request) {
employeeService.register(request.getName());
}
@Override
public Employee view(@PathVariable Integer id) {
Employee employee = employeeService.view(id);
return employee;
}
}
然后,我们将创建EmployeeServiceAdapter(或的EmployeeService为简单起见)类,它实现了EmployeeDBPort接口,并把它作为一个Spring服务。 因此,它将充当将数据持久存储在数据库中的适配器:
@Service
public class EmployeeServiceAdapter implements EmployeeDBPort {
@PersistenceContext
private EntityManager entityManager;
@Transactional
@Override
public void register(String name) {
Employee employee = new Employee();
employee.setName(name);
entityManager.persist(employee);
}
@Override
public Employee getEmployee(Integer id) {
return entityManager.find(Employee.class, id);
}
}
就是这样,我们已经成功地将我们的应用程序分为内部和外部组件。
结果,该应用程序的业务逻辑将通过端口公开,并通过适配器从外部使用。
同样,我们可以创建不同的端口并为任何核心服务实现多个适配器。
例如,消息服务和内容管理服务。
5.结论
在这篇快速的文章中,我们探讨了Java六角形体系结构的概念。
我们已经看到核心业务逻辑(内部组件)可以通过接口作为端口公开,并可以通过实现类由不同的适配器(外部组件)使用。
这种方法有助于编写清晰,易读的代码,而对外部技术的依赖性较小。 但是,我建议有选择地使用这种模式的端口和适配器,而不是完全采用六角形。
From: https://dev.to/smartyansh/hexagonal-architecture-in-java-4m4l