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。