MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象

一、前言

在前面一节,我们分析了SQLSessionFactory的初始化的整个过程,接下来这一节我们将通过查看源码看看SQLSessionFactory获得openSession的整个流程。

二、案例

继续Debug,在34行处打上断点

MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象的照片 - 1

F5下一步,进入DefaultSqlSessionFactory的openSession方法

MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象的照片 - 3

该方法中configuration.getDefaultExecutorType()方法表示获得一个执行器,默认是Simple,执行器有三种Simple,Reuse,Batch三种,如果在全局配置文件中不配置,默认就是Simple

F5下一步,进入DefaultSqlSessionFactory的openSessionFromDataSource方法

MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象的照片 - 5

在这个方法中,configuration做了获取环境变量,创建事务的操作,最关键的一步是通过configuration创建了一个Executor对象

F5下一步,进入Configuration的newExecutor方法

MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象的照片 - 7

在这个方法中,会根据不同的类型(SIMPLE,REUSE,BATCH)创建不同的Executor,如果有缓存配置开启,则创建一个基于缓存的Executor,这些不同类型的Executor都实现了Executor接口,那Executor接口中具体是些什么东西呢?

MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象的照片 - 9

如上图可以看到,Executor都是些与增删改查有关的操作,说明Executor是用来增删改查操作的。

在491行,打上断点

MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象的照片 - 11

这里有一个interceptorChain对象,从字面上来看成为拦截器链,意味着如果配置了拦截器,interceptorChain中会包含这个拦截器。

F5下一步,进入InterceptorChain的pluginAll方法

MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象的照片 - 13

这个方法比较简单,使用每一个拦截器对传进来的Executor进行包装并返回

之后调用完毕后,又重新返回到DefaultSqlSessionFactory的openSessionFromDataSource方法

MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象的照片 - 15

从上面的代码可以看到,返回的Executor被包装在DefaultSqlSession类中并返回

最后返回给了openSession对象。创建openSession对象时,实际上创建了一个很重要的对象那就是Executor。

整个过程的时序图如下:

MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象的照片 - 17

至此,我们关于MyBatis高级篇之运行原理sqlSessionFactory获取openSession对象介绍完毕。

博客地址:http://www.marsitman.com/mybatis/mybatis-source-analyse-opensession.html
版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。

 

 

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!



点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注