mybatis-spring 做了什么?

mybatis-spirng是一个粘合剂,将spring的功能和mybatis的功能粘合在一起。它提供了声明式(xml)与编程式两种配置方式。
首先我们说一下声明式,利用NamespaceHandler和BeanDefinitionParser完成自定义xml解析工作。详细内容可以参考:http://blog.csdn.net/cutesource/article/details/5864562,总的来说就是利用spring.handlers中内容找到处理器org.mybatis.spring.config.NamespaceHandler

http\://mybatis.org/schema/mybatis-spring=org.mybatis.spring.config.NamespaceHandler

处理器中会有解析器MapperScannerBeanDefinitionParser来解析这个xml

  @Override
  public void init() {
    registerBeanDefinitionParser("scan", new MapperScannerBeanDefinitionParser());
  }

这是声明式的,下面我们重点说一下编程式,它也是有两种方式实现的。
第一种是手动注册bean,也就是我们可以将MapperScannerConfigurer通过@Bean的方式注册近容器,因为它是一个BeanDefinitionRegistryPostProcessor,所以在注册Bean的时候就可以发挥作用,可以看一下BeanDefinitionRegistryPostProcessor生命周期方法
postProcessBeanDefinitionRegistry。

  @Override
  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
    if (this.processPropertyPlaceHolders) {
      processPropertyPlaceHolders();
    }

    ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
    scanner.setAddToConfig(this.addToConfig);
    scanner.setAnnotationClass(this.annotationClass);
    scanner.setMarkerInterface(this.markerInterface);
    scanner.setSqlSessionFactory(this.sqlSessionFactory);
    scanner.setSqlSessionTemplate(this.sqlSessionTemplate);
    scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);
    scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);
    scanner.setResourceLoader(this.applicationContext);
    scanner.setBeanNameGenerator(this.nameGenerator);
    scanner.registerFilters();
    scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));
  }

所做的事情应该和解析xml后做的是一致的。
另外一种方式是通过注解的方式@MapperScan,通过注解,我们引入了一个类MapperScannerRegistrar。

@Import(MapperScannerRegistrar.class)
public @interface MapperScan {
...
}

里面的内容也是一样的,都是利用ClassPathMapperScanner扫出合适的MapperBean。

你可能感兴趣的:(mybatis-spring 做了什么?)