Mybatis加载mapper
首先说明一下, 我是在Springboot中使用的Mybatis所以并没有使用xml配置
这里我整合了一份脑图, 需要的自取思维导图
正好给我赚点积分下载资源
MapperScan
MapperScan这个注解的作用就是将我们的mapper包中的所有mapper接口注册入mybatis,
所以我从这里开始入手全局搜索这个MapperScan
上图中可以看见MapperScannerRegistrar这个类是唯一一个有使用到这个注解类的类, 这个类的作用很明显就是一个Mapper注册连接器
这个类中只有三个方法和一个内部类
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 获取了MapperScan注解中的值, 我们上面的mapper包的位置就在这个注解的value中
AnnotationAttributes mapperScanAttrs = AnnotationAttributes
.fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));
if (mapperScanAttrs != null) {
// 解析注解
registerBeanDefinitions(mapperScanAttrs, registry);
}
}
在解析过程中主要是获取mapper
解析方法中的最后一步就是使用了ClassPathMapperScanner的doScan方法扫描
scanner.doScan(StringUtils.toStringArray(basePackages));
@Override
public Set<BeanDefinitionHolder> doScan(String... basePackages) {
// 使用的父类的doScan方法
Set<BeanDefinitionHolder> beanDefinitions = super.doScan(basePackages);
if (beanDefinitions.isEmpty()) {
LOGGER.warn(() -> "No MyBatis mapper was found in '" + Arrays.toString(basePackages) + "' package. Please check your configuration.");
} else {
// 扫描到的类在这里做进一步的设置
processBeanDefinitions(beanDefinitions);
}
// 返回设置好的mapper
return beanDefinitions;
}
这里是spring的内容, 粗略看一看
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
Assert.notEmpty(basePackages, "At least one base package must be specified");
// 先new一个结果Set
Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();
// 对传入的packages进行遍历
for (String basePackage : basePackages) {
// findCandidateComponents这个方法就是扫描我们配置的mapper包, 获得class
// 里面将com.nit.lab.mapper转换为classpath*:com/nit/lab/mapper/**/*.class
Set<BeanDefinition> candid