第一、spring 與mybaits整合
- BeanDefinitionRegistryPostProcessor
- InitializingBean
- ApplicationContextAware
- BeanNameAware
BeanDefinitionRegistryPostProcessor 在bean初始化的時候調用
InitializingBean 在創建的時候調用
Aware 所有的Aware都跟spring容器相關
Mybatis源碼分析
前言
分析mybatis源碼之前。首先需要猜測mybaits是如何與spring整合。如何自動與讀取xml問題,如何將mapper與xml做映射
- 1、spring啓動的時候會讀取xml文件
- 2、然後初始化mybaits文件
- 3、使用動態代理建xml與mapper文件結合起來然後產生代理類對象
我們注意到這裏有兩三個與Mapper相關的配置:
- SqlSessionFactory#mapperLocations,指定xml文件的配置路徑
- SqlSessionFactory#configLocation,指定mybaits的配置文件,該配置文件也可以配置mapper.xml的配置路徑信息
- apperScannerConfigurer,掃描Mapper的java類(DAO)
mybatis 架構圖
分析第一文件 spring 與mybaits整合 mybaits-spring
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
if (this.processPropertyPlaceHolders) {
this.processPropertyPlaceHolders();
}
// 定義ClassPathMapperScanner下面的路徑
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, ",; \t\n"));
}
org.springframework.context.annotation.ClassPathBeanDefinitionScanner#scan
public int scan(String... basePackages) {
int beanCountAtScanStart = this.registry.getBeanDefinitionCount();
this.doScan(basePackages);
if (this.includeAnnotationConfig) {
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
return this.registry.getBeanDefinitionCount() - beanCountAtScanStart;
}