作者:梁飞 叩丁狼教育高级讲师。原创文章,转载请注明出处。
源码分析-Mybatis全局配置对象的创建
Mybatis所有的配置信息以及mapper的配置信息,全部存储于Configuration对象中,Configuration相当于Mybatis的对象实体。Configuration对象从初始创建会一直贯穿Mybatis运行的整个生命周期,为Mybatis的运行提供必要的配置信息。Mybatis全局配置对象创建的过程,就是给Configuration对象中属性赋值的过程。
首先,在Mybatis开始运行时,首先需要创建SqlSessionFactoryBuilder对象,在调用该对象的build方法时,把读取了主配置文件的输入流作为参数来创建SqlSessionFactory对象。
可以直接进入到build的方法中查看其执行过程
在SqlSessionFactoryBuilder类中存在多个重载的方法,名字都为build,最终都会执行参数为configuration的方法,而configuration对象就是由XMLConfigbuilder对象的parse方法返回。可以直接进入到parse方法中,代码截图如下:
在XMLConfigbuilder的parse方法中,会首先判断配置文件是否已经解析过。核心的方法显然是在调用parseConfiguration方法。该方法以一个XNode的对象作为参数,从方法的源代码中可以很容易的看出来,每一个方法就是在解析mybatis.xml主配置文件中的某一个节点信息,同时将解析出的值付给configuration对象下相应的属性中。
以propertiesElement方法为例,
该方法同样以一个XNode对象作为参数。首先读取除了properties节点下所有的子节点,然后在添加上resource或者url属性对应的资源文件的属性值。最终把所有的属性配置相关的信息赋值给configuration对象中的variables属性中。
再如解析mapper配置信息的方法为mapperElement:
循环mapper标签中所有的子节点,同样读取resource或者url或者class对应的资源文件的的信息,调用XMLMapperBuilder对象的parse方法来解析对应的mapper映射文件。
当XMLConfigbuilder对象中的parseConfiguration方法执行结束时,configuration对象就初始化完成。为了更好的理解整个过程,现对两个类进行一个详细说明,分别为XPathParser和XNode。
XPathParser是Mybatis一个核心的类,通过类名可以预测该类是在对XPath进行解析,即对xml配置文件进行解析。XMLConfigbuilder中有该类的一个属性。
该类中的方法主要分成两类,构造方法和evalXXX。
每个构造方法中都会执行commonConstructor和createDocument。commonConstructor主要对当前对象的基本属性设置了初始值。createDocument方法主要对创建document对象时用到的两个对象DocumentBuilderFactory和DocumentBuilder设置了初始值。
而evalXXX方法则是来解析节点的方法。例如解析布尔类型的方法有两个。其余类型的解析方法都是大同小异的。
另一个类XNode是对org.w3c.dom.Node类的一个封装,在Node类的基础上添加了一些新功能。其构造方法如下:
parseBody:设置body属性的值
evalXXX:解析节点
getXXXBody:获取body属性的值并将其转换为对应的类型
getXXXAttribute:获取属性的值,并转化为相应的类型
getChildren:获取所有类型为元素节点的子节点
getChildrenAsProperties:将所有类型为元素节点的子节点以properties形式返回。