Mybatis 源码解析(二) - Configuration.xml解析

文章个人学习源码所得,若存在不足或者错误之处,请大家指出。

上一章中叙述了Configuration.xml流化到Mybatis内存中的过程,那么接下来肯定就是Configuration.xml文件解析操作,在Mybatis中,这个解析的操作由SqlSesssionFactoryBuilder负责。接下来我们看看SqlSessionFactoryBuilder的方法签名:

SqlSessionFactoryBuilder提供了9个签名方法,其中前8个方法都是Configuration.xml的解析方法,第9个方法build(Configuration)则负责产生SqlSessionFactory,前8个方法中主要提供了以Reader和InputStream两种方式解析Configuration.xml,最终起决定作用的是

Build(Reader, String, Properties)
Build(InputStream, String, Properties)

在这两个方法对Configuration.xml解析的过程中到底做了什么呢,这是一个复杂的过程,下面将分步进行一一解析(以Reader为例,Reader和InputStream没有本质差别的):

1.SqlSessionFactoryBuilder大致解析过程:

由图中可知,XMLConfigBuilder主要负责Configuration.xml的解析过程,其实上图只是一个大致的流程,XMLConfigBuilder的parsef方法才是最终的解析动作

2.XMLConfigBuilder:

在研究parse()具体解析之前,我们需要知道XMLConfigBuilder实例到底做了什么

由类图可以看出XMLConfigBuilder会同时持有Configuration、TypeAliasRegistry、TypeHandlerRegistry、XPathParser的引用,在实例化过程中实际上是为XML解析构造了XPathParser实例,并且为之后解析数据预先初始化了Configuration实例,用于存储XML数据。

3.文件的具体解析:

private void parseConfiguration(XNode root) {
    try {
      // .. node.evalNode("..."): 获取node下...节点
      //issue #117 read properties first
      propertiesElement(root.evalNode("properties"));
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      reflectionFactoryElement(root.evalNode("reflectionFactory"));
      settingsElement(root.evalNode("settings"));
      // read it after objectFactory and objectWrapperFactory issue #631
      environmentsElement(root.evalNode("environments"));
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      typeHandlerElement(root.evalNode("typeHandlers"));
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }

Mybatis在加载之初,就对所有的文件节点进行了解析,从上面解析的代码我们可以分析出Mybatis中Configuration.xml的主要结构如下:

<configuration>
    <properties resource="" url="">
        ...
    </properties>
    <typeAliases>
        ...
    </typeAliases>
    <plugins>
        ...
    </plugins>
    <objectFactory>
        ...
    </objectFactory>
    <objectWrapperFactory>
        ...
    </objectWrapperFactory>
    <reflectionFactory>
        ...
    </reflectionFactory>
    <settings>
        ...
    </settings>
    <environments>
        ...
    </environments>
    <databaseIdProvider>
        ...
    </databaseIdProvider>
    <typeHandlers>
        ...
    </typeHandlers>
    <mappers>
        ...
    </mappers>
</configuration>

总结:Configuration.xml在Mybatis中解析的大致逻辑就是酱紫的,接下去会详细讲解Configuration.xml每一项的详细解析。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-12 11:53:49

Mybatis 源码解析(二) - Configuration.xml解析的相关文章

浩哥解析MyBatis源码(十一)——Parsing解析模块之通用标记解析器(GenericTokenParser)与标记处理器(TokenHandler)

原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6724223.html 1.回顾 上面的几篇解析了类型模块,在MyBatis中类型模块包含的就是Java类型与Jdbc类型,和其间的转换处理.类型模块在整个MyBatis功能架构中属于基础组件之一,是提前注册到注册器中,并配置到Configuration中备用. 从这一篇开始解析Parsing解析模块,这个模块不同于Type模块,这个模块更像是一套工具模块.本篇先解析通用标记解析器Gene

【MyBatis源码分析】Configuration加载(上篇)

config.xml解析为org.w3c.dom.Document 本文首先来简单看一下MyBatis中将config.xml解析为org.w3c.dom.Document的流程,代码为上文的这部分: 1 static { 2 try { 3 reader = Resources.getResourceAsReader("mybatis/config.xml"); 4 ssf = new SqlSessionFactoryBuilder().build(reader); 5 } 6 c

手把手带你阅读Mybatis源码(二)执行篇

前言 上一篇文章提到了MyBatis是如何构建配置类的,也说了MyBatis在运行过程中主要分为两个阶段,第一是构建,第二就是执行,所以这篇文章会带大家来了解一下MyBatis是如何从构建完毕,到执行我们的第一条SQL语句的.之后这部分内容会归置到公众号菜单栏:连载中…-框架分析中,欢迎探讨! 入口(代理对象的生成) public static void main(String[] args) throws Exception { /******************************构

mybatis 源码分析二

1.SqlSession下的四大对象 Executor.StatementHandler.ParameterHandler.ResultSetHandler StatementHandler的作用是使用数据库的Statement(PreparedStatement)执行操作 ParameterHandler是用来处理SQL参数的 ResultSetHandler是进行数据集的封装返回处理的 2.mybatis中有3中执行器: SIMPLE--简易执行器,默认 REUSE--是一种能够执行重用预处

手把手带你阅读Mybatis源码(三)缓存篇

前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读Mybatis源码(一)构造篇 和 手把手带你阅读Mybatis源码(二)执行篇,主要说明了MyBatis是如何将我们的xml配置文件构建为其内部的Configuration对象和MappedStatement对象的,然后在第二篇我们说了构建完成后MyBatis是如何一步一步地执行我们的SQL语句并且对结果集进行封装的. 那么这篇作为MyBatis系列的最后一篇,自然是要来聊聊MyBatis中的一个不可忽视的

mybatis源码-解析配置文件(三)之配置文件Configuration解析(超详细, 值得收藏)

1. 简介 1.1 系列内容 本系列文章讲解的是mybatis解析配置文件内部的逻辑, 即 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 其背后的逻辑. 1.2 适合对象 了解如何使用 mybatis 来访问数据库.可参看<

MyBatis 源码分析 - 配置文件解析过程

* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAliases和typeHandlers等,本文的篇幅也主要在对这三个配置解析过程的分析上.下面,我们来一起看一下本篇文章的目录结构. 从目录上可以看出,2.3节.2.5节和2.8节的内容比较多.其中2.3节是关于settings配置解析过程的分析,除了对常规的 XML 解析过程分析,本节额外的分析了元

mybatis源码-解析配置文件(四)之配置文件Mapper解析

在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的一部分配置, 在本文章中, 我们讲解解析mappers节点, 即 xxxMapper.xml 文件的解析. 1 解析入口 在解析 mybatis-config.xml 时, 会进行解析 xxxMapper.xml 的文件. 在图示流程的 XMLConfigBuilder.parse() 函数中, 该

Mybatis源码解析(四) —— SqlSession是如何实现数据库操作的?

Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的? ??如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一样,本篇文章最最核心的要点就是 SqlSession实现数据库操作的源码解析.但按照惯例,我这边依然列出如下的问题: 1. SqlSession 是如何被创建的? 每次的数据库操作都会创建一个新的SqlSession么?(也许有很多同学会说SqlSession是通过 SqlSessionFactor