MyBatis 的初始化会在整个项目启动时开始执行,主要用来完成配置文件的解析、数据库的连接等工作。
获取 InputStream
下面从主方法入手,来追踪 MyBatis 的初始化过程。主方法中首先进行的是InputStream对象的获取,如下面代码所示:
进入 Resources#getResourceAsStream 方法中,可以发现 ClassLoaderWrapper 中的getResourceAsStream(String,ClassLoader[])方法根据配置文件的路径获取到配置文件的输入流:
ClassLoaderWrapper#getResourceAsStream
整个过程中涉及的 Resource类和ClassLoaderWrapper类均在 MyBatis的 io包中:
这也印证了 Resource类和ClassLoaderWrapper类是负责读写外部文件的。
配置信息读取
获取 InputStream后,进行的是下面这个操作:
这一步首先创建了一个SqlSessionFactoryBuilder类的实例,然后调用了其build方法。
build方法有多个,其中的核心方法如下图所示:
分别对 最开始的两步进行追踪 XMLConfigBuilder#parse:
调用此方法可以获取到一个对配置文件完成解析的 Configuration 实例对象:
通过 XMLConfigBuilder 对象的 parse 方法获得了Configuration 对象后,SqlSessionFactoryBuilder 自身的build 方法接受 Configuration 对象为参数,返回了SqlSessionFactory对象:
这样主函数中“SqlSessionFactory sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream)”这一句的解析就结束了:
总结
通过上面的追踪,MyBatis 的初始化阶段已经分析完毕。在初始化阶段,MyBatis 主要进行了以下几项工作:
- 根据配置文件的位置,获取它的输入流 InputStream。
- 从配置文件的根节点开始,逐层解析配置文件,也包括相关的映射文件。解析过程中不断将解析结果放入 Configuration对象。
- 以配置好的 Configuration对象为参数,获取一个SqlSessionFactory对象。
