使用@MapperScan

在MybatisPlusAutoConfiguration类中,除了会注入SqlSessionFactory和SqlSessionTemplate外,还会检查容器是否注入了MapperScanner扫描器。
在这里插入图片描述
@ConditionalOnMissingBean({MapperFactoryBean.class, MapperScannerConfigurer.class})
首先去检查出否有MapperFactoryBean和MapperScannerConfigurer两个类的bean,通过idea的查找,发现MapperFactoryBean没有手动注入,再看看MapperScannerConfigurer,其中一部分如图:
在这里插入图片描述
大概的意思就是,通过此mapper扫描器从容器中扫描到的候选bean定义,就将它们注册成MapperFactoryBean类的bean。具体源码如下:
在这里插入图片描述
在这里插入图片描述
注意doScan(),ClassPathMapperScanner重写了:
在这里插入图片描述
processBeanDefinitions():
在这里插入图片描述
将扫描到的bean定义的类型修改成MapperFactoryBean,源码结束。
那问题来了,MapperScannerConfigurer能创建MapperFactoryBean,那MapperScannerConfigurer还需要自己来配置吗?
在这里插入图片描述
使用@MapperScan注解,我们可以就可以直接注入MapperScannerConfigurer啦。

在这里插入图片描述
在这里插入图片描述
函数末尾就注册了MapperScannerConfigurer的bean定义。
到此我们发现,我们只使用了@MapperScan就可以直接扫描到我们需要的Mapper类,并不需要@Mapper,当然@MapperScan需要指定扫描的包路径,其他包是扫描不到的。

不使用@MapperScan

回到此图:在这里插入图片描述
如果没有使用@MapperScan,就是导入一个AutoConfiguredMapperScannerRegistrar
在这里插入图片描述
注释的大概意思:这个类扫描的路径和当前springboot扫描的路径一样。如果需要扫描其他项目的路径,可以使用@MapperScan。
我们从源码可以看到,packages从beanFactory中获取,annotationClass设置成Mapper,说明扫描路径和springboot的一样,只扫描@Mapper注解。

总结

1.多项目下,可以使用@MapperScan包扫描多包路径
2.不使用@MapperScan,就必须使用@Mapper并且类路径在Springboot路径下能找到,才可以正常使用。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐