# Spring Bean 循环依赖修复报告 ## 问题描述 应用启动时出现 `BeanCreationException` 错误,错误信息显示: ``` Error creating bean with name 'bszxBmController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bszxBmServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cmsArticleServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cmsNavigationServiceImpl': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cmsDesignServiceImpl': Injection of resource dependencies failed ``` ## 根本原因分析 通过分析代码发现了两个主要的循环依赖问题: ### 1. 自我注入问题 在 `CmsNavigationServiceImpl` 中存在自我注入: ```java @Service public class CmsNavigationServiceImpl extends ServiceImpl implements CmsNavigationService { @Resource private CmsNavigationService cmsNavigationService; // 自我注入! // 在方法中使用 final CmsNavigation parent = cmsNavigationService.getOne(...); } ``` ### 2. 循环依赖问题 - `CmsNavigationServiceImpl` 依赖 `CmsDesignService` - `CmsDesignServiceImpl` 依赖 `CmsNavigationService` 这形成了一个循环依赖链: ``` CmsNavigationServiceImpl → CmsDesignService → CmsDesignServiceImpl → CmsNavigationService → CmsNavigationServiceImpl ``` ## 修复方案 ### 修复1:解决自我注入问题 **文件**: `src/main/java/com/gxwebsoft/cms/service/impl/CmsNavigationServiceImpl.java` **修复前**: ```java @Resource private CmsNavigationService cmsNavigationService; // 使用时 final CmsNavigation parent = cmsNavigationService.getOne(new LambdaQueryWrapper()...); ``` **修复后**: ```java // 移除自我注入的依赖 // 使用时改为调用 this final CmsNavigation parent = this.getOne(new LambdaQueryWrapper()...); ``` ### 修复2:解决循环依赖问题 **文件**: `src/main/java/com/gxwebsoft/cms/service/impl/CmsDesignServiceImpl.java` **修复前**: ```java @Resource private CmsNavigationService cmsNavigationService; ``` **修复后**: ```java import org.springframework.context.annotation.Lazy; @Resource @Lazy private CmsNavigationService cmsNavigationService; ``` ## 修复详情 ### 1. CmsNavigationServiceImpl.java 修复 - **移除自我注入**: 删除了 `private CmsNavigationService cmsNavigationService;` 字段 - **修改方法调用**: 将 `cmsNavigationService.getOne(...)` 改为 `this.getOne(...)` ### 2. CmsDesignServiceImpl.java 修复 - **添加 @Lazy 注解**: 在 `CmsNavigationService` 依赖上添加 `@Lazy` 注解 - **导入必要的类**: 添加 `import org.springframework.context.annotation.Lazy;` ## @Lazy 注解的作用 `@Lazy` 注解告诉 Spring 容器延迟初始化这个 Bean,直到第一次被实际使用时才创建。这样可以打破循环依赖: 1. Spring 首先创建 `CmsNavigationServiceImpl`(不立即注入 `CmsDesignService`) 2. 然后创建 `CmsDesignServiceImpl`(延迟注入 `CmsNavigationService`) 3. 当实际需要使用时,再完成依赖注入 ## 验证修复 修复后,Spring 应用应该能够正常启动,不再出现循环依赖错误。 ## 最佳实践建议 1. **避免循环依赖**: 在设计服务层时,尽量避免相互依赖 2. **使用 @Lazy**: 当必须存在循环依赖时,使用 `@Lazy` 注解 3. **重构设计**: 考虑将共同依赖提取到单独的服务中 4. **自我注入检查**: 避免在服务实现类中注入自己的接口 ## 影响范围 - ✅ 修复了应用启动时的 Bean 创建异常 - ✅ 保持了原有的业务逻辑不变 - ✅ 提高了应用的稳定性 - ✅ 遵循了 Spring 的最佳实践 修复完成后,应用应该能够正常启动并运行。