很早就学习了mybatis,但是一直没有对mybatis有深入的研究,最近看了mybatis的使用文档,准备研究下mybatis的底层实现。推荐大家看看这个专栏:
深入了解Mybatis原理
1.先来看看代码上是如何创建SqlSessionFactory
- 读取配置文件mybatis-config.xml,变成输入流。
- SqlSessionFactory的创建者SqlSessionFatoryBuilder通过build()方法创建SqlSessionFactory
2.SqlSessionFactory创建过程
图我是使用http://www.draw.io在线画图构建的。
在我的github上有http://www.draw.io可以直接导入的xml文件或是直接下载查看的图片。
图片的地址:https://github.com/bluesnail95/UML/tree/master/MyBatis
3.各片段源码分析
(1)在1中的new SqlSessionFactoryBuilder().build(inputStream)调用的是SqlSessionFactoryBuilder类中的以下方法。
(2)调用重载方法build()初始化Configuration
(3)XMLConfigBuilder
调用XPathParser的构造方法创建配置文件输入流的Document
XMLConfigBuilder调用父类的构造方法创建了Configuration
(2)中的parser.evalNode(“/configuration”)获取的是在mybatis-config.xml中的configuration元素。然后调用parseConfiguration()方法解析configuration元素下的其他子元素,包括properties,settings,mappers等等。
解析configuation元素过程
(4)解析完xml,初始化Configuration之后,创建DefaultSqlSessionFactory。这个也是最终我们用来创建SqlSession的工厂。