序言
项目中我们经常会遇到这样的错误:Field userMapper in com.shiqi.mybatis.bug.demo.service.impl.UserServiceImpl required a bean of type 'com.shiqi.mybatis.bug.demo.mapper.UserMapper' that could not be found.
今天我们就一起通过源码来探究下产生的原因。
源码探究
SpringBoot 的核心就是自动装配,所以MyBatis整合Spring Boot的话,一定也会提供一个MyBatisAutoConfiguration
我们进行全局搜索找到MyBatisAutoConfiguration这个配置类,然后会发现这个类中有两个内部类:
AutoConfiguredMapperScannerRegistrar

通过注释我们可以看到MyBatis扫描的路径为Spring Boot启动类同级下的包。

我们往下看,会发现扫描路径下使用@Mapper注解的接口

所以上述Bug, 我们的解决方案就是在Mapper接口上加上@Mapper注解。
⚠️ 但是尤其注意的是,如果Mapper接口在不同的Maven模块中,即使使用了@Mapper 注解进行标识,也不不能扫描到。
MapperScannerRegistrarNotFoundConfiguration

这个内部类允许我们的mapper接口不在Spring Boot启动类同级包路径下。

而这个内部类只有在没有MapperFactoryBean 和 MapperScanConfigure两个类的时候生效。

所以如果项目是分多模块的并且Mapper接口不和SpringBoot 启动类在同一级目录下,我们通过@MapperScan注解指定扫描的路径为Mapper接口所在的包。
可以看看游艺同学的分析
MyBatis常见问题分析!源码跟踪技巧!看完你就能找到那些消失的Mapper了!
3592

被折叠的 条评论
为什么被折叠?



