Mybatis原理解析(二)SqlSession的创建过程

在上一篇中我们一起深入地看了SqlSessionFactory在创建的过程中里面都做了些什么,所以这里我们就接着讲下一步SqlSession的创建。没看上一篇的点这里:

Mybatis原理解析(一)解析全局xml配置文件生成SqlSessionFactory

首先我们知道了在创建SqlSessionFactory的过程中,其实底层大部分就是在初始化我们的Configuration对象,通过这个构建好的Configuration对象作为参数创建出一个DefaultSqlSession对象给上层。所以说现在我们拿到了一个包含有Configuration对象的DefaultSqlSession对象。

所以现在我们要研究的就是SqlSession session = sqlSessionFactory.openSession(true)这一个创建SqlSession的过程底层做了什么了。

好,话不多说,我们debug走起。

继续深入openSessionFromDataSource方法

 在这里很明显我们可以看到最终返回给我们的是一个DefaultSqlSession对象,而该对象需要一个Executor,Executor是什么,有何用?这里我们就深入创建Executor的newExecutor方法看看。

 

对于这个方法我们分三部分来看

part1

根据传过来的defaultExecutorType去判断要创建什么类型的Executor,如果类型是simple的,就创建出SimpleExecutor,类型是reuse的,就创建出ReuseExecutor,类型是batch的,就创建出BatchExecutor。

part2

创建好了具体的Executor对象之后,然后再看是否开启了二级缓存,二级缓存的设置是在全局配置文件中去设置的,所以说如果开启了,我们的Configuration对象的cacheEnabled属性就为true,否则为false。如果是true,即开启了二级缓存的话,那么我们就会将创建好的Executor对象作为参数传入一个叫CacheExecutor的构造函数中。所以我们可以深入到CacheExecutor中:

可以发现传入的Executor对象赋值给了里面的Executor变量 ,看它的其他方法,比如:

可以发现里面真正执行与数据库交互的操作其实还是我们传入的Executor对象,说明CacheExecutor只是一个将我们的Executor再封装了一层而已,然后在里面加多了一些缓存的方法罢了,其实这也是Java设计模式的静态代理的实现了,CacheExecutor就相当于Executor的一个代理类,这个代理类增加了缓存的功能。 

part3 

executor = (Executor) interceptorChain.pluginAll(executor)这一句很重要,在之后我们好会遇到这一句代码,这是什么?这其实就和我们的插件机制有关了,在Mybatis中我们可以自定义插件,这个我们以后再说。

经过了这3部分之后,就拿到了一个可能被CacheExecutor和插件封装过的Executor对象了。最后返回给上层

最后,我们拿到的就是一个实现了SqlSession接口的DefaultSqlSession对象了,而且该对象里面包含了Configuration对象和可能被封装过的Executor对象。

猜你喜欢

转载自blog.csdn.net/weixin_37689658/article/details/99121800