看了《深入浅出 MyBatis 技术原理和实战》一书中构建 SqlSessionFactory 这一节,感觉书上的条理对我来说不太清晰,在此我按照自己的思路将其理清。
SqlSessionFactory 是 MaBatis 的核心类之一,其最重要的功能就是创建 MyBatis 的核心接口 SqlSession,因此我们需要先创建 SqlSessionFactory 。
构建过程
一、读取配置文件,创建 Configuration 单例
在 SqlSessionFactory 构建过程中,首先需要用到一个 Configuration 对象。事实上,在 SqlSessionFactory 的构建过程中, Configuration 是最重要的,它读取配置文件并保存为一个单例。它有如下的作用:
-
读取配置文件,包括基础配置的XML和映射器XML。
-
初始化基础配置,如 MyBatis 的别名以及一些重要的类对象(如插件、映射器、ObjectFactory 和 typeHandler 对象。
-
提供单例,为后续创建 SessionFactory 提供服务并提供配置参数。
-
执行一些重要的对象方法,初始化配置信息。
Configuration 是通过 XMLConfigBuilder 构建的。首先, MyBatis 会读取所有的 XML 配置的信息,然后将这些信息保存到 Configuration 的单例实例中,并初始化以下内容:
-
properties 全局参数
-
settings 设置
-
tpyeAliases 别名
-
ObjectFactory 类型处理器
-
plugin 插件
-
environment 环境
-
DatabaseIdProvider 数据库标识
-
Mapper 映射器
这一步完成后,就可以构建 SqlSessionFactory 了。
二、 使用 Configuration 构建 SqlSessionFactory
有了 Configuration 对象构建 SqlSessionFactory 就很简单了,我们只要写很简单的代码:
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
MyBatis 会根据 Configuration 的配置读取配置的信息,构建 SqlSessionFactory 的实现。SqlSessionFactory 是一个接口,其默认的实现类是org.apache.ibatis.session.defaults.DefaultSqlSessionFactory,一般情况下我们都没有必要自己创建新的 SqlSessionFactory 实现类。
总结
在 MyBatis 中使用 SqlSessionFactoryBuilder ,采用Builder模式来构建它,构建主要分两步:
-
通过 org.apache.ibatis.builder.xml.XMLConfigBuilder 解析 XML 配置文件,将读取的配置信息存入 org.apache.ibatis.session.Configration 类中, MyBatis 几乎所有的配置都是存在这里的。
-
使用 Configuration 对象创建 SqlSessionFactory 。SqlSessionFactory 是一个接口,其默认的实现类是org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。一般情况下我们都没有必要自己创建新的 SqlSessionFactory 实现类。
创建 SqlSessionFactory 的方式是一种 Builder 模式。对于复杂的对象而言,直接使用构造方法构建是有困难的,会导致大量的逻辑放在构造方法中。由于对象的复杂性,我们更希望能在构建的时候一步步有秩序地来构建它,从而降低复杂性。在这里,MyBatis 使用一个参数类 Configuration 总领全局,然后分步构建,使得复杂的对象 SqlSessionFactory 被构建出来。这种方式值得我们在工作中学习和使用。
参考文献
[1] 杨开振. 深入浅出 MyBatis 技术原理和实战[Z]. 北京: 电子工业出版社,2016.