SqlSessionFactory的创建过程

首先是创建一个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并返回~!

 

posted on 2016-07-04 19:27  涩谷直子  阅读(2420)  评论(0编辑  收藏  举报