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。