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。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容