1.首先构造工具类SqlSessionFactoryUtils
主要代码如下
通过26行代码加载mybatis-config.xml文件的内容
2.
27行调用 new SqlSessionFactoryBuiler().build(inputStream);实现创建sqlSessionFactory
sqlSessionFactory为接口:
实现类有,本次以DefaultSqlSession为目标进行分析。
3.我们跟进到SqlSessionFactoryBuiler类中,查看其构造方法和build()方法
4.跳转到SqlSessionFactoryBuiler类中发现 没有构造方法(系统会自动生成一个无参的构造方法)
5.继续看SqlSessionFactoryBuiler的build(InputStream input)方法
6.该方法又调用了自身对象的另外一个同名方法
7.我们跟进来发现这个方法的返回值类型为SqlSessionFactory,所以SqlSessionFactory的创建肯定在这个方法内完成。
8.第77行 创建了一个XMLConfigBuilder对象parser
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
9.跟进到这个对象,来看看这个对象到底是何方神圣。
首先看到的是这个类继承了BaseBuilder类。那么BaseBuilder类之后再讨论,继续往下看
这个是刚刚的构造方法(生成了一个XPathParser对象,这又是什么???) 继续跟下去。
10.下面是XPathParser类的成员变量和方法。 我们发现都是用来解析XML文件的。(跳过不分析)
11.通过XPathParser对象解析了XML文件。并封装成XPathParser的一个对象
12.然后又调用了XMLConfigBuilder的另外一个private构造方法
12.注意这个构造方法 !!!
第一句调用了父类的构造方法!传入参数为new Configuration()对象??
13. 让我们看一下父类(BaseBuilder)的构造方法内容是什么
14.在父类BaseBuilder中我们可以看有三个成员变量:Configuration、TypeAliasRegistry、TypeHandlerRegistry)(配置类? 别名注册类?类型处理器注册类?)
15。接着我们回到子类XMLConfigBuilder
继续向下看
图中方框中标识的方法: 调用父类的成员变量:configuration的setVariables(props)方法;]
15.继续我们跟进去,看一下里面都是有什么。
好像给Configu'ration对象的variables变量赋值. 先不管它,继续向下分析
16.这个构造方法走完了发现也没什么特殊的,但是我们要记得XMLConfigBuilder的父类BaseBuilder有一个成员变量叫做Configuration哦!!!
接着返回一个XmlConfiguration对象
17.向上跳回到:SqlSessionFactoryBuilder.build()方法
18.第50行调用了parser的parse()方法后又调用了build方法。
我们先看看parser的parse()方法都是做了些什么吧。
parsed为真的话,抛出个异常? 先不管他,继续看。
19.这个方法又调用了自己对象的 parseConfiguration(parser.evalNode("/configuration"));方法;
跟进去看一下。
20.跳入这个方法,我们发现里面有好多方法。(build模式?)
21. 其中我们重点看一下第118行的typeHandlerElement(root.evalNode("typeHandlers"));
从方法名和参数类型我们可以了解到,不就是从XML文件中读取到typeHandlers并处理吗。我们继续进到这个方法看一下吧。
22.这部分好像就是TypeHandler的解析并注册过程。不过并不是本次的主要目的,先跳过去吧。
23. 继续向下走,返回一个Configuration的成员变量(父类中声明的哦!)
24. 继续向上走,回到SqlSessionFactoryBuilder.builder()方法;
25.接着又调用了build方法,跟进去看一下吧。
26.返回了一个SqlSessionFactory的实现类的对象: new DefaultSqlSessionFactory(Configuration config);
又是这个Configuration出现了。
27. 我们还是进去看看这个类到底干嘛的吧。跟到Configuration类
这个类中含有大量的成员变量,我们猜测这是个配置类。
29.构造方法中的这些代码不正是系统声明的别名吗? 所以答案就是这个就是配置类。
既然知道Configuration是个配置类,那么
也就可以解释了。
在文章开头我们看到了SqlSessionFactory的继承关系。
所以本次创建过程就完成了,
接下来我们还是看看DefaultSqlSessionFactory这个类都是些什么变量和方法吧,跟到DefaultSqlSessionFactory类
从结构图中看到,有一个成员变量Configuration(就是刚刚传入的哦)
还有若干个OpenSession()方法。
本次浅析就到这了,接下来的文章继续分析OpenSession过程。