核心结论
classpath::仅在当前模块的类路径中查找资源。classpath*::在所有模块(包括依赖的JAR包)的类路径中递归查找资源。- 多模块项目必须使用
classpath*:。
详细对比
| 特性 | classpath: |
classpath*: |
|---|---|---|
| 查找范围 | 仅限当前应用或模块的类路径(如 src/main/resources)。 |
当前类路径 + 所有依赖JAR包的类路径。 |
| 适用场景 | 单体应用,所有资源文件都在本项目内。 | 多模块/微服务项目,或依赖第三方JAR包中含有资源文件。 |
| 多模块结果 | 无法扫描到依赖子模块JAR包中的Mapper文件,导致 Invalid bound statement错误。 |
能正确扫描并加载所有依赖模块中的Mapper文件。 |
| 性能 | 相对更快(搜索范围小)。 | 相对稍慢(搜索范围广,通常影响可忽略)。 |
配置示例
在Spring Boot的 application.yml中,多模块项目应如下配置:
yaml
mybatis:
mapper-locations: classpath*:mapper/**/*.xml
重要补充说明
-
路径通配符:
**/*.xml:匹配任意深度的子目录。*.xml:仅匹配当前目录,不进入子目录。
-
最佳实践:
-
无脑推荐:在多模块项目中,MyBatis的
mapper-locations统一使用classpath*:前缀。 -
若追求极致精确,可指定具体路径(需了解依赖JAR内结构):
yamlmybatis: mapper-locations: classpath*:com/yourcompany/**/mapper/*.xml
-
-
常见错误 :在聚合模块中使用
classpath:导致启动失败,提示绑定语句找不到。首要检查点就是将此配置改为classpath*:。