MyBatis的启动很简单,通过Mybatis官方文档中的Getting started 给出了如下栗子:
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
};
简单说来就是通过指定的配置文件构造一个SqlSessionFactory实例,再通过SqlSessionFactory的openSession方法获得SqlSession实例。
SqlSession是Mybatis中的一个核心类提供了很多我们在日常使用Mybatis时Mapper接口的底层支持方法。
分析开源项目,我比较喜欢使用的是先假设再验证的方法。例如如果是Mybatis类似的启动过程的功能需要我去实现,我会怎么做。

这样一个功能看起来还是比较简单的,我们可以设计一个Reader类去读取xml文件,然后将xml信息封装在对应的Configuration类中,最后将Configuration类交给SqlSessionFactory即可。
下面我们来验证下Mybatis是不是按照这个流程去实现的。实际流程如下:

从上图我们可以看出,和我前面猜测的思路还是基本一致的。但是Mybatis的作者在实现上会比我们自己要来得更细,并且应用了Builder设计模式。
Resources类是用来简化资源文件的访问,提供了一系列的资源加载的方法。
XMLConfigBuilder类将inputStream转换成Configuration。
SqlSessionFactoryBuilder类build出SqlSessionFactory。
在这个启动过程中我们发现了2个Builder类,接下来那我们就来看看builder模式吧。Builder模式应该是大家在工作中比较常用到的一种模式了。它属于GOF模式中的创建类模式(creational)。简单描述就是通过一个Builder类去创建另一个类的实例,从而避免了类构造器的污染。从下图可以看到通过Builder创建了Hero类,我们通过设置Builder类中的不同属性来build出不同的Hero。

类图来自www.java-design-patterns.com
我们再来看看MyBatis中XmlConfigBuilder和SqlSessionFactory的类图。

