Mybatis-Plus @MapperScan用与不用区别
使用@MapperScan在MybatisPlusAutoConfiguration类中,除了会注入SqlSessionFactory和SqlSessionTemplate外,还会检查容器是否注入了MapperScanner扫描器。@ConditionalOnMissingBean({MapperFactoryBean.class, MapperScannerConfigurer.class})首
使用@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路径下能找到,才可以正常使用。
更多推荐
所有评论(0)