Mybaits 源碼分析第二章

第一、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;
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章