Spring Boot六边形架构类划分推荐子包及模板优化咨询
Spring Boot六边形架构:推荐子包结构及示例优化
一、完整推荐子包清单
1. 领域层(核心内六边形)
这部分是业务核心,不依赖任何外部技术实现:
[根包].domain.model:存放领域实体、值对象、聚合根,是业务规则的核心载体[根包].domain.ports:[根包].domain.ports.in:定义入站端口,即外部系统可触发的业务能力接口(比如用户下单、查询订单的用例接口)[根包].domain.ports.out:定义出站端口,即领域层需依赖的外部资源接口(比如订单持久化、发送通知的接口)
[根包].domain.services:领域服务,处理跨聚合的复杂业务逻辑(单一聚合可完成的逻辑直接放在实体中)[根包].domain.events:领域事件,用于领域内或跨领域的事件通知(比如订单创建后触发库存扣减事件)[根包].domain.exceptions:自定义领域异常,封装业务相关错误(比如“库存不足”“用户不存在”)[根包].domain.specifications:业务规则规范,集中管理复杂业务约束(比如“用户必须实名认证才能下单”)
2. 入站适配器层(驱动适配器,外部触发核心逻辑)
这部分负责接收外部请求,转换后调用领域层的入站端口:
[根包].adapters.inbound:入站适配器根目录[根包].adapters.inbound.rest:REST API适配器[根包].adapters.inbound.rest.controllers:REST控制器,处理HTTP请求[根包].adapters.inbound.rest.dtos:请求/响应DTO,与领域模型解耦[根包].adapters.inbound.rest.mappers:DTO与领域模型的转换工具[根包].adapters.inbound.rest.validators:请求参数校验器,处理接口参数验证
[根包].adapters.inbound.bus:消息总线消费者(比如Kafka、RabbitMQ)[根包].adapters.inbound.bus.listeners:消息监听器,接收外部消息[根包].adapters.inbound.bus.dtos:消息接收DTO[根包].adapters.inbound.bus.mappers:消息DTO转领域模型的工具
[根包].adapters.inbound.cli:命令行接口适配器(如有批量操作、运维命令需求)[根包].adapters.inbound.graphql:GraphQL适配器(如用GraphQL替代REST)
3. 出站适配器层(被驱动适配器,核心依赖的外部实现)
这部分实现领域层定义的出站端口,对接外部资源:
[根包].adapters.outbound:出站适配器根目录[根包].adapters.outbound.db:数据库适配器[根包].adapters.outbound.db.entities:JPA/Hibernate实体类(与领域模型解耦)[根包].adapters.outbound.db.repositories:Spring Data Repository接口[根包].adapters.outbound.db.mappers:实体类与领域模型的转换工具[根包].adapters.outbound.db.config:数据库配置类(比如JPA实体扫描、事务管理器)
[根包].adapters.outbound.bus:消息总线生产者[根包].adapters.outbound.bus.producers:消息生产者,发送领域事件到外部总线[根包].adapters.outbound.bus.dtos:消息发送DTO[根包].adapters.outbound.bus.mappers:领域模型转消息DTO的工具
[根包].adapters.outbound.external:第三方API调用适配器[根包].adapters.outbound.external.clients:Feign/RestTemplate客户端[根包].adapters.outbound.external.dtos:外部API的请求/响应DTO[根包].adapters.outbound.external.mappers:领域模型与外部DTO的转换工具
[根包].adapters.outbound.cache:缓存适配器(比如Redis)[根包].adapters.outbound.cache.config:缓存配置类[根包].adapters.outbound.cache.repositories:缓存操作的实现类
4. 应用引导与配置层
[根包].config:Spring Boot配置类,负责绑定适配器与端口(比如把数据库适配器实现注入到领域层的出站端口)[根包].Application:Spring Boot启动类(直接放在根包下即可)
二、对示例模板的补充与修改
你提到的示例模板已经覆盖了核心结构,但针对大型Spring Boot应用,还需要做这些优化:
1. 领域层优化
- 拆分ports子包:示例里的
domain.ports未区分入站和出站端口,建议拆成domain.ports.in和domain.ports.out。前者定义外部可调用的业务接口,后者定义领域需要的外部资源接口,职责更清晰,避免端口混淆。 - 补充领域辅助模块:添加
domain.events、domain.exceptions、domain.specifications:domain.events:处理领域事件的发布与订阅,实现业务解耦;domain.exceptions:把业务错误封装成自定义异常,与技术异常区分开,方便统一处理;domain.specifications:把复杂业务规则抽离出来,让领域实体更简洁,规则也更容易复用。
2. 入站适配器层补充
- 细化REST适配器结构:示例里的
adapters.inbound.rest只有一层,建议拆分出controllers、dtos、mappers、validators子包,把控制器、数据传输对象、转换工具、校验器分开,符合单一职责原则,代码更易维护。 - 扩展适配器类型:根据业务需求添加
cli、graphql等子包,覆盖不同的外部访问方式。 - 消息消费者分层:在
adapters.inbound.bus下添加listeners子包,专门存放消息监听器类,与dtos、mappers分开,结构更清晰。
3. 出站适配器层补充
- 数据库适配器加配置子包:添加
adapters.outbound.db.config,存放数据库相关的配置类,避免配置类散落在根包或其他业务包中。 - 新增外部API适配器:大型应用通常会依赖第三方服务,添加
adapters.outbound.external子包专门处理这类调用,示例模板未覆盖这部分。 - 新增缓存适配器:缓存是大型应用性能优化的关键,添加
adapters.outbound.cache子包,封装Redis等缓存操作,实现领域层定义的缓存端口。 - 消息生产者分层:在
adapters.outbound.bus下添加producers子包,专门存放消息生产者类,职责更明确。
4. 统一配置层
添加根包下的config子包,专门存放Spring Bean的注册配置,比如把出站适配器的实现绑定到领域层的出站端口,避免配置类和业务代码混杂。
内容的提问来源于stack exchange,提问作者Marc Le Bihan
相关产品推荐
相关产品推荐

