##近期准备做一下Mybatis的源码解读,整个系列大概会有6-7篇文章。
先释放一下目录:
1.Mybatis框架组件设计&顶层接口
###2.Mybatis框架启动流程分析
3.Mybatis框架源码Configuration分析
4.Mybatis框架一条插入语句的执行流程
5.Mybatis框架从源码角度来讲执行增,删,改的时候如何保证线程安全?
6.Mybatis框架一条查询语句的执行流程
7.Mybatis的日志&异常体系
8.Mybatis与Spring集成过程
9.Mybatis的CRUD代码生成
写这篇文章的目的一方面是面试问的频率比较高,也比较难。另一方面也是对Mybatis的启动流程比较感兴趣,希望知道启动过程中的不同阶段做了什么事,如何组织数据结构。
这里我阅读的是Mybatis3的一些源码,同时会通过test目录里的test-case做一些debug。阅读源码的效率,理解源码内容上会好很多。
先放一张流程图说明Mybatis启动过程:
Mybatis的启动过程有两条线,一条明线,一条暗线:
明线:简单看Mybatis的启动过程是在通过一些工厂创建SqlSession对象,解析配置文件。
暗线:实际上是在初始化Configuration.看源码可以知道Configuration在很多地方都被依赖了。但是呢却不怎么了解Configuration在Mybatis中的定位。这个会在第三篇文章中专门对Configuration类做解析介绍。
下面我们通过debug看一下Mybatis的整体启动初始化过程。
我们重点跟踪一下Mybatis源码中的test case中的:org.apache.ibatis.session.SqlSessionManagerTest#setup()方法
先以debug方式启动:org.apache.ibatis.session.SqlSessionManagerTest#shouldCommitInsertedAuthor()方法
这里有个隐含的问题就是说是初始化Configuration对象,但是从哪初始化的呢,从哪去解析的呢?可以看一下XMLConfigBuilder的构造方法和其父类的构造方法,如下图:
上面几步我们已经创建了Configuration对象,并且一些属性有了默认值,如下图:
下面我们继续debug,看
这个方法执行结束整个初始化Configuration对象的过程也就结束了,后面会通过这个初始化好的Configuration再创建SqlSessionManager,SqlSessionFactory对象等。
我们继续跟其中一个方法如:org.apache.ibatis.builder.xml.XMLConfigBuilder#mapperElement
这里继续深入一些看这个方法:org.apache.ibatis.builder.xml.XMLMapperBuilder#parameterMapElement()
解析xxDAOMapper.xml的过程比较隐蔽,因为是逐层解析的,因此不会明显的去解析某文件夹下的某xml文件。解析过程的起点是mybatis的配置文件mapperconfig.xml.
整个解析过程结束后我们简单看一下sqlSessionManager的创建过程。
到这里我们通过debug的方式将整个mybatis的启动过程梳理了一遍,由于初始化过程涉及到很多具体的处理细节,这里不再展开,读者可以将mybatis的代码down下来,本地直接跑test-case,然后debug具体看某一方面的实现细节,相信一定能收获很多。