
Spring Cloud Alibaba 中优化多模块代码结构:将公共组件集中到 Common 模块
在基于 Spring Cloud Alibaba (2021.0.1) 和 Spring Boot (2.6.4) 的微服务项目中,模块化设计至关重要。本文探讨如何有效地将多个业务模块 (例如 merchant 和 supply 模块) 的 Entity、Mapper 和 Service 层代码集中到一个公共模块 (common 模块) 中,从而避免代码冗余,提高代码可维护性和复用性。
项目结构
假设项目结构如下:
-
common 模块: 包含
model(Entity)、mapper、service、impl、数据库连接配置、统一异常处理、Redis JSON 数据格式化、统一响应结果封装、Swagger 集成、MyBatis-Plus 配置、CORS 跨域配置等公共组件。 - merchant 模块: 商户端微服务,主要包含 Controller 层,对外提供 API 接口。
- supply 模块: 供货商端微服务,同样主要包含 Controller 层,对外提供 API 接口。
问题及解决方案
在将公共组件集中到 common 模块后,启动 merchant 或 supply 模块可能会遇到类似 org.springframework.beans.factory.BeanCreationException 的错误,提示 RequestMappingHandlerAdapter 或其他 Bean 初始化失败。这通常是因为 Spring Boot 无法正确扫描到 common 模块中的组件。
解决方法:
-
精确的包扫描配置: 在每个业务模块 (例如
merchant和supply) 的启动类中,使用@SpringBootApplication注解的scanBasePackages属性,明确指定需要扫描的包路径,确保包含common模块的包路径。例如:@SpringBootApplication(scanBasePackages = {"com.quanneng", "com.quanneng.common"}) // 确保包含common模块的包路径 @MapperScan("com.quanneng.common.mapper") // 扫描common模块下的Mapper接口 public class MerchantApiApplication { // ... }注意:
com.quanneng替换为你的项目根包名,com.quanneng.common为common模块的包路径。@MapperScan注解用于显式扫描common模块下的 Mapper 接口。 -
避免重复配置: 确保在
common模块中已经正确配置了数据库连接、MyBatis-Plus、Swagger 等公共组件,并在业务模块中避免重复配置这些组件。 例如,只在common模块中配置DataSource,业务模块不再需要配置。 -
考虑创建 Spring Boot Starter: 为了更优雅地管理和复用
common模块,建议将其打包成一个 Spring Boot Starter。这样,其他模块只需要在pom.xml中添加依赖即可使用common模块中的组件,无需手动配置包扫描路径,也降低了出错的可能性。 -
统一异常处理: 项目中应该只有一个统一的异常处理机制,避免在多个模块中重复定义异常处理器。
通过以上步骤,可以有效地解决 BeanCreationException 错误,并实现 common 模块中公共组件的复用,从而提高代码质量和开发效率。 记住要仔细检查包名和路径的正确性,确保 Spring Boot 能正确扫描到 common 模块中的所有组件。










