标签:
首先是创建一个SqlSessionFactoryBuilder,由其名字可以看出是创建SqlSessionFactory的,跟进类中,发现它没有构造方法,只有各种重载的build方法,返回值都是SqlSessionFactory,
看来为了创建SqlSessionFactory也是煞费苦心。。。
经过一次内部调用,来到这个build方法
此时的参数只有最开始的输入字符流:Resources.getResourceAsReader(resource),另外两个参数:environment和properties均为空。
在这里,XMLConfigBuilder是一个解析XML配置的类,主要作用就是解析xml配置文件并初始化一些信息。
继续跟进XMLConfigBuilder的构造方法,发现首先是调用了重载的构造方法,并且有两个与XML解析相关的类:
XMLMapperEntityResolver是一个实现了xml标准EntityResolver的实现类,略过
XPathParser继续解析,跟进其构造方法,目的之一是得到一个关联xml配置的Document对象
执行commonConstructor,主要是初始化一些配置
而下面的createDocument则产生了此Document对象,具体不赘述。
执行完毕之后,就调用了XMLConfigBuilder重载的构造方法:
可以看出这里,首先是初始化了一个全局配置类:Configuration,该类是MyBatis的总配置类,使用的地方非常多,后面会再探讨。
初始化完毕之后,继续调用父类BaseBuilder的构造方法:
主要是初始化了三个属性:配置类,类型别名注册类,类型处理注册类,并且可以看出后两个属性均是configuration的属性
简要看看TypeAliasRegistry:
TypeHandlerRegistry:
都和数据类型相关的配置类。
初始化完毕之后,就得到了XMLConfigBuilder对象,此时代码继续回到SqlSessionFactory的build方法,
下面接着调用XMLConfigBuilder对象的parse方法:
跟进如下:
首先是xml解析类解析方法parse():
在parse方法里面,就开始解析mybatis的配置文件:
首先是得到根节点<configuration>
下面就是解析此节点,也即配置文件的内容:
查看parseConfiguration方法:
得到的根节点XNode root具体值如下:
此内容正是我的配置文件的内容。
同时在parseConfiguration方法里面也可以看到解析的顺序:properties,typeAliases,plugins,。。。。
这里查看一下mapper节点的解析:
跟进mapperElement方法:
传入的mapper节点内容如下:
解析时首先是遍历mappers节点,然后判断节点是否是package,如果是则获取其name属性并将其set到主配置类configuration的属性MapperRegistry mapperRegistry中
该属性主要是记录下dao接口和其匹配的xml配置文件,以至于后续可以由sqlSession产生dao接口对应的代理实现类。
由于这里只有mapper子节点,所以继续走,依次获取节点的resource,url,mapperClass属性,并且可以看到,三者属性只能存在一种。
这里获取到了resource节点:com/qc/dao/userDao-mapping.xml
接着初始化ErrorContext,记录错误的源头resource
然后由此resource得到对应的输入流,用于生成XMLMapperBuilder,该类的作用是解析每个dao接口对应xml,这里就是要解析com/qc/dao/userDao-mapping.xml
调用XMLMapperBuilder的构造方法,如下:
它也是先生成XML解析类XPathParser,和之前解析Configuration一致,不赘述
生成完毕之后,调用重载构造方法:
这里也是传入配置类,调用父类构造方法,初始化。
然后生成MapperBuilderAssistant对象,该对象在后续解析中也使用挺多。
注意XMLConfigBuilder,XMLMapperBuilder,MapperBuilderAssistant均是BaseBuilder的子类~!
得到XMLMapperBuilder对象之后,就开始解析dao对应的xml文件。
这里先不赘述,后续再研读
配置文件都解析完毕之后,属性都已初始化完毕,配置都已经安装完毕,下面返回SqlSessionFactory的build方法:
可以看到,这里生成的是DefaultSqlSessionFactory并返回~!
标签:
原文地址:http://www.cnblogs.com/seguzhizi/p/5639492.html