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每一项的详细解析。

猜你喜欢

转载自blog.csdn.net/securitit/article/details/47301723