前言
对于任何框架而言, 在使用前都要进行一系列的初始化, MyBatis 也不例外. 本章将通过以下几点详细介绍 MyBatis 的初始化过程.
MyBatis 的初始化做了什么
MyBatis 基于 xml 配置文件创建 Configuration 对象的过程
手动加载 xml 配置文件创建 Configuration 对象完成初始化, 创建并使用 SqlSessionFactory 对象
涉及到的设计模式
一, MyBatis 的初始化做了什么
任何框架的初始化, 无非是加载自己运行时所需要的配置信息. MyBatis 的配置信息, 大概包含以下信息, 其高层级结构如下:
* configuration 配置
* properties 属性
* settings 设置
* typeAliases 类型命名
* typeHandlers 类型处理器
* objectFactory 对象工厂
* plugins 插件
* environments 环境
* environment 环境变量
* transactionManager 事务管理器
* dataSource 数据源
* 映射器
MyBatis 的上述配置信息会配置在 xml 配置文件中, 那么, 这些信息被加载进入 MyBatis 内部, MyBatis 是怎样维护的呢?
MyBatis 采用了一个非常直白和简单的方式 --- 使用 org.apache.ibatis.session.Configuration 对象作为一个所有配置信息的容器, Configuration 对象的组织结构和 xml 配置文件的组织结构几乎完全一样 (当然, Configuration 对象的功能并不限于此, 它还负责创建一些 MyBatis 内部使用的对象, 如 Executor 等, 这将在后续的文章中讨论). 如下图所示:
MyBatis 根据初始化好 Configuration 信息, 这时候用户就可以使用 MyBatis 进行数据库操作了.
可以这么说, MyBatis 初始化的过程, 就是创建 Configuration 对象的过程.
MyBatis 的初始化可以有两种方式:
基于 xml 配置文件: 基于 xml 配置文件的方式是将 MyBatis 的所有配置信息放在 xml 文件中, MyBatis 通过加载并 xml 配置文件, 将配置文信息组装成内部的 Configuration 对象
基于 Java API: 这种方式不使用 xml 配置文件, 需要 MyBatis 使用者在 Java 代码中, 手动创建 Configuration 对象, 然后将配置参数 set 进入 Configuration 对象中
(PS: MyBatis 具体配置信息有哪些, 又分别表示什么意思, 不在本文的叙述范围)
接下来我们将通过 基于 xml 配置文件方式的 MyBatis 初始化, 深入探讨 MyBatis 是如何通过配置文件构建 Configuration 对象, 并使用它的.
二, MyBatis 基于 xml 配置文件创建 Configuration 对象的过程
现在就从使用 MyBatis 的简单例子入手, 深入分析一下 MyBatis 是怎样完成初始化的, 都初始化了什么. 看以下代码:
有过 MyBatis 使用经验的读者会知道, 上述语句的作用是执行 com.foo.bean.BlogMapper.queryAllBlogInfo 定义的 SQL 语句, 返回一个 List 结果集. 总的来说, 上述代码经历了 mybatis 初始化 --> 创建 SqlSession --> 执行 SQL 语句 返回结果三个过程.
上述代码的功能是根据配置文件 mybatis-config.xml 配置文件, 创建 SqlSessionFactory 对象, 然后产生 SqlSession, 执行 SQL 语句. 而 mybatis 的初始化就发生在第三句: SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
现在就让我们看看第三句到底发生了什么.
MyBatis 初始化基本过程:
SqlSessionFactoryBuilder 根据传入的数据流生成 Configuration 对象, 然后根据 Configuration 对象创建默认的 SqlSessionFactory 实例.
初始化的基本过程如下序列图所示:
由上图所示, mybatis 初始化要经过简单的以下几步:
1. 调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法;
2. SqlSessionFactoryBuilder 会根据输入流 inputStream 等信息创建 XMLConfigBuilder 对象;
3. SqlSessionFactoryBuilder 调用 XMLConfigBuilder 对象的 parse() 方法;
4. XMLConfigBuilder 对象返回 Configuration 对象;
5. SqlSessionFactoryBuilder 根据 Configuration 对象创建一个 DefaultSessionFactory 对象;
6. SqlSessionFactoryBuilder 返回 DefaultSessionFactory 对象给 Client, 供 Client 使用.
SqlSessionFactoryBuilder 相关的代码如下所示:
上述的初始化过程中, 涉及到了以下几个对象:
SqlSessionFactoryBuilder : SqlSessionFactory 的构造器, 用于创建 SqlSessionFactory, 采用了 Builder 设计模式
Configuration : 该对象是 mybatis-config.xml 文件中所有 mybatis 配置信息
SqlSessionFactory:SqlSession 工厂类, 以工厂形式创建 SqlSession 对象, 采用了 Factory 工厂设计模式
XmlConfigParser : 负责将 mybatis-config.xml 配置文件解析成 Configuration 对象, 共 SqlSessonFactoryBuilder 使用, 创建 SqlSessionFactory
创建 Configuration 对象的过程
接着上述的 MyBatis 初始化基本过程讨论, 当 SqlSessionFactoryBuilder 执行 build() 方法, 调用了 XMLConfigBuilder 的 parse() 方法, 然后返回了 Configuration 对象. 那么 parse() 方法是如何处理 xml 文件, 生成 Configuration 对象的呢?
1. XMLConfigBuilder 会将 xml 配置文件的信息转换为 Document 对象, 而 xml 配置定义文件 DTD 转换成 XMLMapperEntityResolver 对象, 然后将二者封装到 XpathParser 对象中, XpathParser 的作用是提供根据 Xpath 表达式获取基本的 DOM 节点 Node 信息的操作. 如下图所示:
2. 之后 XMLConfigBuilder 调用 parse() 方法: 会从 XPathParser 中取出 <configuration > 节点对应的 Node 对象, 然后解析此 Node 节点的子 Node:
properties, settings, typeAliases,typeHandlers, objectFactory, objectWrapperFactory, plugins, environments,databaseIdProvider, mappers
注意: 在上述代码中, 还有一个非常重要的地方, 就是解析 xml 配置文件子节点 < mappers > 的方法 mapperElements(root.evalNode("mappers")), 它将解析我们配置的 Mapper.xml 配置文件, Mapper 配置文件可以说是 MyBatis 的核心, MyBatis 的特性和理念都体现在此 Mapper 的配置和设计上, 我们将在后续的文章中讨论它, 敬请期待~
3. 然后将这些值解析出来设置到 Configuration 对象中.
解析子节点的过程这里就不一一介绍了, 用户可以参照 MyBatis 源码仔细揣摩, 我们就看上述的 environmentsElement(root.evalNode("environments")); 方法是如何将 environments 的信息解析出来, 设置到 Configuration 对象中的:
4. 返回 Configuration 对象
我们将上述的 MyBatis 初始化基本过程的序列图细化.
三, 手动加载 xml 配置文件创建 Configuration 对象完成初始化, 创建并使用 SqlSessionFactory 对象
我们可以使用 XMLConfigBuilder 手动解析 xml 配置文件来创建 Configuration 对象, 代码如下:
四, 涉及到的设计模式
初始化的过程涉及到创建各种对象, 所以会使用一些创建型的设计模式. 在初始化的过程中, Builder 模式运用的比较多.
Builder 模式应用 1: SqlSessionFactory 的创建
对于创建 SqlSessionFactory 时, 会根据情况提供不同的参数, 其参数组合可以有以下几种:
由于构造时参数不定, 可以为其创建一个构造器 Builder, 将 SqlSessionFactory 的构建过程和表示分开:
MyBatis 将 SqlSessionFactoryBuilder 和 SqlSessionFactory 相互独立.
Builder 模式应用 2: 数据库连接环境 Environment 对象的创建
在构建 Configuration 对象的过程中, XMLConfigParser 解析 mybatis xml 配置文件节点 < environment > 节点时, 会有以下相应的代码:
在 Environment 内部, 定义了静态内部 Builder 类:
以上就是本文 《深入理解 mybatis 原理》Mybatis 初始化机制详解的全部内容, 希望对大家有所帮助! 上述内容如有不妥之处, 还请读者指出, 共同探讨, 共同进步!
来源: http://www.bubuko.com/infodetail-2979604.html