在基于 Spring Cloud Alibaba (2021.0.1) 和 Spring Boot (2.6.4) 的微服务项目中,模块化设计至关重要。本文探讨如何有效地将多个业务模块 (例如 merchant
和 supply
模块) 的 Entity、Mapper 和 Service 层代码集中到一个公共模块 (common
模块) 中,从而避免代码冗余,提高代码可维护性和复用性。
假设项目结构如下:
model
(Entity)、mapper
、service
、impl
、数据库连接配置、统一异常处理、Redis JSON 数据格式化、统一响应结果封装、Swagger 集成、MyBatis-Plus 配置、CORS 跨域配置等公共组件。在将公共组件集中到 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
模块中的所有组件。