1.9 KiB
1.9 KiB
循环依赖解决方案
当前问题
在应用程序上下文中存在循环依赖:
┌─────┐
| printController (field private com.goeing.printserver.main.service.PrintQueueService com.goeing.printserver.main.PrintController.printQueueService)
↑ ↓
| printQueueService (field private com.goeing.printserver.main.PrintController com.goeing.printserver.main.service.PrintQueueService.printController)
└─────┘
临时解决方案
已在 application.properties 中添加以下配置,临时允许循环依赖:
spring.main.allow-circular-references=true
已实施的重构步骤
- 创建了
PrintService接口,定义打印相关操作 - 修改
PrintController实现PrintService接口 - 修改
PrintQueueService依赖PrintService而不是直接依赖PrintController
后续重构建议
为彻底解决循环依赖问题,建议进一步重构:
方案一:使用事件驱动架构
- 使用 Spring 的事件机制(ApplicationEventPublisher)替代直接方法调用
PrintQueueService发布打印事件PrintController订阅并处理这些事件
方案二:引入服务层抽象
- 创建更完整的服务层抽象,明确职责分离
- 将
PrintController中的业务逻辑移至专门的服务类 - 让
PrintController和PrintQueueService都依赖这个新服务类
方案三:重新设计组件职责
- 重新评估
PrintController和PrintQueueService的职责 - 可能的职责划分:
PrintController:仅处理 HTTP 请求和响应PrintQueueService:管理打印队列和执行打印操作- 新增
PrintExecutionService:实际执行打印操作的逻辑
最佳实践
- 遵循单一职责原则,每个类只负责一个功能领域
- 使用依赖注入,但避免双向依赖
- 考虑使用事件驱动架构处理组件间通信
- 使用接口进行解耦,降低组件间直接依赖