MapperScannerRegister类作为Spring集成Mybatis的核心类之一,主要功能:
(1)读取@MapperScan或@MapperScans注解元数据
(2) 注册MapperScannerConfigurer类的bean定义信息,并将@MapperScan或@MapperScans注解元数据设置为MapperScannerConfigurer的bean定义属性。
该类实现了ImportBeanDefinitionRegistrar接口,重写了registerBeanDefinitions(AnnotationMetada importingClassMetadata, BeanDefinitionRegistry registry。@MapperScan被@Import注解修饰,@Import注解value属性为MapperScannerRegistrar,该类被实例化并调用其核心方法(该类具体的实例化和核心方法的调用会有专门的章节讲解)。
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 获取@MapperScan注解元数据
AnnotationAttributes mapperScanAttrs = AnnotationAttributes
.fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName()));
// @MapperScan注解元数据不为空,注册MapperScannerConfigurer的bean定义
// generateBaseName(importingClassMetada,0)返回的beanName为
// com.xx.yy.zz.Application#MapperScannerRegistrar#0
if (mapperScanAttrs != null) {
registerBeanDefinitions(importingClassMetadata, mapperScanAttrs, registry,
generateBaseBeanName(importingClassMetadata, 0));
}
}
void registerBeanDefinitions(AnnotationMetadata annoMeta, AnnotationAttributes annoAttrs,
BeanDefinitionRegistry registry, String beanName) {
// 实例化MapperScannerConfigurer的bean定义构造者
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);
// 通过构造者为bean定义设置属性processPropertyPlaceHolders为true
builder.addPropertyValue("processPropertyPlaceHolders", true);
// 获取@MapperScan注解的annotationClass的属性
Class<? extends Annotation> annotationClass = annoAttrs.getClass("annotationClass");
if (!Annotation.class.equals(annotationClass)) {
builder.addPropertyValue("annotationClass", annotationClass);
}
// 获取@MapperScan注解的markerInterface的属性
Class<?> markerInterface = annoAttrs.getClass("markerInterface");
if (!Class.class.equals(markerInterface)) {
builder.addPropertyValue("markerInterface", markerInterface);
}
// 获取@MapperScan注解的nameGenerator的属性
Class<? extends BeanNameGenerator> generatorClass = annoAttrs.getClass("nameGenerator");
if (!BeanNameGenerator.class.equals(generatorClass)) {
builder.addPropertyValue("nameGenerator", BeanUtils.instantiateClass(generatorClass));
}
// 获取@MapperScan注解的factoryBean属性
Class<? extends MapperFactoryBean> mapperFactoryBeanClass = annoAttrs.getClass("factoryBean");
if (!MapperFactoryBean.class.equals(mapperFactoryBeanClass)) {
builder.addPropertyValue("mapperFactoryBeanClass", mapperFactoryBeanClass);
}
// 获取@MapperScan注解的sqlSessionTemplateRef属性
String sqlSessionTemplateRef = annoAttrs.getString("sqlSessionTemplateRef");
if (StringUtils.hasText(sqlSessionTemplateRef)) {
// bean定义中设置属性名为sqlSessionTemplateBeanName,值为@MapperScan注解的sqlSessionTemplateRef属性值
builder.addPropertyValue("sqlSessionTemplateBeanName", annoAttrs.getString("sqlSessionTemplateRef"));
}
// 获取@MapperScan注解的sqlSessionFactoryRef属性
String sqlSessionFactoryRef = annoAttrs.getString("sqlSessionFactoryRef");
if (StringUtils.hasText(sqlSessionFactoryRef)) {
// bean定义中设置属性名为sqlSessionFactoryBeanName,值为@MapperScan注解的sqlSessionFactoryRef属性值
builder.addPropertyValue("sqlSessionFactoryBeanName", annoAttrs.getString("sqlSessionFactoryRef"));
}
List<String> basePackages = new ArrayList<>();
basePackages.addAll(
// 获取并合并@MapperScan中value、basePackages、basePackageClasses属性 Arrays.stream(annoAttrs.getStringArray("value")).filter(StringUtils::hasText).collect(Collectors.toList()));
basePackages.addAll(Arrays.stream(annoAttrs.getStringArray("basePackages")).filter(StringUtils::hasText)
.collect(Collectors.toList()));
basePackages.addAll(Arrays.stream(annoAttrs.getClassArray("basePackageClasses")).map(ClassUtils::getPackageName)
.collect(Collectors.toList()));
// basePackages为空,将设置默认的basePackages,详见getDefaultBasePackage(annoMeta)方法
// 解析@MapperScan注解的类的包名,作为basePackages
if (basePackages.isEmpty()) {
basePackages.add(getDefaultBasePackage(annoMeta));
}
// 获取@MapperScan注解的lazyInitialization的属性
String lazyInitialization = annoAttrs.getString("lazyInitialization");
if (StringUtils.hasText(lazyInitialization)) {
builder.addPropertyValue("lazyInitialization", lazyInitialization);
}
// 获取@MapperScan注解的defaultScope属性
String defaultScope = annoAttrs.getString("defaultScope");
if (!AbstractBeanDefinition.SCOPE_DEFAULT.equals(defaultScope)) {
builder.addPropertyValue("defaultScope", defaultScope);
}
// bean定义添加basePackage属性
builder.addPropertyValue("basePackage", StringUtils.collectionToCommaDelimitedString(basePackages));
// for spring-native
// 设置bean定义的role成员变量,ROLE_INFASTRUCTURE表示该bean为后台角色
builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
// registry中注册bean定义
registry.registerBeanDefinition(beanName, builder.getBeanDefinition());
}