将根据下面的流程图分析Mybatis源码
SqlSessionFactory对象的创建过程和Configuration对象的创建
- 全局配置文件加载流程Resources是Mybatis的工具类主要用于加载配置文件的
InputStream
- 调用的是Resources静态方法getResourcresAssStream()方法它调用了重载的getResourcresAssStream()方法通过类加载器加载配置文件返回一个的字节流
public
- 重载的getResourcresAssStream()方法返回字节流文件
public
- 1.使用sqlSessionFactoryBuilder创建sqlSession
-
- SqlSessionFactoryBuilder 该类是 SqlSessionFactory(会话工厂)的构建者类,之前描述的操作其实全是从这里面 开启的,首先就是调用 XMLConfigBuilder 类的构造器来创建一个 XML 配置构建器对象, 利用这个构建器对象来调用其解析方法 parse()来完成 Configuration 对象的创建,之后以这 个配置对象为参数调用会话工厂构建者类中的 build(Configuration config)方法来完成 SqlSessionFactory(会话工厂)对象的构建。
-
SqlSessionFactory
- 2.SqlSerssionFactoryBuilder调用build方法传入读取到的全局配置文件的流对象
public
- 3.调用重载的build方法
public
- 4.在XMLConfigBuilder对象的构造方法内同时调用父类的构造方法完成Configuration对象的创建,最后将创建好的XMLConfigBuilder对象返回到
-
- XMLConfigBuilder 该类是 XML 配置构建者类,是用来通过 XML 配置文件来构建 Configuration 对象实例, 构建的过程就是解析 Configuration.xml 配置文件的过程,期间会将从配置文件中获取到的指 定标签的值逐个添加到之前创建好的默认 Configuration 对象实例中。
-
public
- 5.在创建完毕Configuration对象的实例后将进行了mybatis的文件的解析
public
- 在parse()方法内判断可以忽略主要的是parseConfigguration()方法此方法是解析xml文档的方法我们可以看
- evalNode()方法传入的字符串是xml文档的根节点,那么很明显传入一个根节点创建一个Document对象
public
- 文档解析方法parseConfigguration()此方法是具体解析mybatis全局配置文件的文档的方法,此方法内的方法的作用主要是对Configuration对象进行赋值(Configuration对象映射的就是mybats的全局配置文件)
private
- 看源码就知道了文件的解析逻辑是很明了的逻辑不是很复杂,并且每个节点解析完后都要将解析后的值赋值给Configuration对象的就拿properties节点举例
private
- 到此Configuration配置文件核心对象已将创建完毕,再回到build()方法返回值是一个的SqlSessionFactory对象但是SqlSessionFactory是一个接口那么返回的肯定是实现类
- OK看了返回的就是此对象DefaultSqlSessionFactory实现类对象,DefaultSqlSessionFactory对象接收的参数刚好是创建好已经构建好的Configuration对象到此SqlSessionFactory已将创建完毕
- SqlsessionFactory 该 接 口 是 会 话 工 厂 , 是 用 来 生 产 会 话 的 工 厂 接 口 , DefaultSqlSessionFactory 是其实现类,是真正生产会话的工厂类,这个类的实例的生命周期 是全局的,它只会在首次调用时生成一个实例(单例模式),就一直存在直到服务器关闭。
public
- 结论
-
- 1.Configuration 对象的创建优先于文件的解析
- 2.SqlSessionFactory工厂对象返回的其实是其子类DefaultSqlSessionFactory对象
- 3.DefaultSqlSessionFactory是全局唯一的
-
二)Configuration对象
- 该对象是 Mybatis 的上下文对象,实例化这个类的目的就是为了使用其对象作为项目全 局配置对象,这样通过配置文件配置的信息可以保存在这个配置对象中,而这个配置对象在 创建好之后是保存在 JVM 的 Heap 内存中的,方便随时读取。不然每次需要配置信息的时 候都要临时从磁盘配置文件中获取,代码复用性差的同时,也不利于开发。
- 此对象的主要作用就是存储配置文件的信息,和初始化的相关的信息的,并且Configuration作为全局上下文只有一个实例
- 简单看下源码提几个的需要知道的
-
- 1.使用聚合的方式将其他的节点聚合到了Configuration对象内如下几个
-
protected
- 2.Configuration的构造方法
- 给很多的属性起了别名这也是为什么可以使用JDBC/MANAGED等名称控制事务的原因
public
三)DefaultSqlSessionFactory
- DefaultSqlSessionFactory是SqlsessionFactory 该接口是会话工厂,是用来生产会话的工厂接 口 , DefaultSqlSessionFactory 是其实现类,是真正生产会话的工厂类,这个类的实例的生命周期 是全局的,它只会在首次调用时生成一个实例(单例模式),就一直存在直到服务器关闭。
-
- 看下DefaultSqlSessionFactory是怎么创建SqlSession对象的呢?
- 1.SqlSession是一个的接口那么创建SqlSession对象的必定是SqlSession接口的实现类
-
public
- 2.SqlSessionFactory接口内的方法
-
- 看到SqlSessionFactory内的openSession()方法很熟悉吧
-
public
- 3.DefaultSqlSessionFactory内的方法
private
- 4.openSessionFromDataSource()方法就是构件了默认的SqlSession对象
private
- 5.默认的DefaultSqlSession
-
- 实现了接口SqlSession接口并且实现了相关的方法
- 设置了基本的连接参数
- SqlSession接口内封装了常见的对数据库的操作,增删改查操作
-
public
- 到此SqlSession对象创建完毕,其实我们使用的是默认的DefaultSqlSession对象。