文章个人学习源码所得,若存在不足或者错误之处,请大家指出。
上一章中叙述了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每一项的详细解析。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Mybatis 源码解析(二) - Configuration.xml解析
原文地址:http://blog.csdn.net/securitit/article/details/47301723