Spring集成Mybatis的核心类-MapperScannerRegistrar

        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());

  }

     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值