MyBits运行原理之 SqlSessionFactory的创建过程

时间:2024-04-09 09:00:51

1.首先构造工具类SqlSessionFactoryUtils

    主要代码如下

    MyBits运行原理之 SqlSessionFactory的创建过程

         通过26行代码加载mybatis-config.xml文件的内容

    2.

        27行调用 new SqlSessionFactoryBuiler().build(inputStream);实现创建sqlSessionFactory

          sqlSessionFactory为接口:

            实现类有MyBits运行原理之 SqlSessionFactory的创建过程,本次以DefaultSqlSession为目标进行分析。

  

    3.我们跟进到SqlSessionFactoryBuiler类中,查看其构造方法和build()方法

    MyBits运行原理之 SqlSessionFactory的创建过程

    4.跳转到SqlSessionFactoryBuiler类中发现 没有构造方法(系统会自动生成一个无参的构造方法)

     5.继续看SqlSessionFactoryBuiler的build(InputStream input)方法

    MyBits运行原理之 SqlSessionFactory的创建过程

    6.该方法又调用了自身对象的另外一个同名方法

        MyBits运行原理之 SqlSessionFactory的创建过程

    7.我们跟进来发现这个方法的返回值类型为SqlSessionFactory,所以SqlSessionFactory的创建肯定在这个方法内完成。

    8.第77行 创建了一个XMLConfigBuilder对象parser

        XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);

      9.跟进到这个对象,来看看这个对象到底是何方神圣。

    MyBits运行原理之 SqlSessionFactory的创建过程

    首先看到的是这个类继承了BaseBuilder类。那么BaseBuilder类之后再讨论,继续往下看    

    这个是刚刚的构造方法(生成了一个XPathParser对象,这又是什么???) 继续跟下去。

MyBits运行原理之 SqlSessionFactory的创建过程

    10.下面是XPathParser类的成员变量和方法。 我们发现都是用来解析XML文件的。(跳过不分析)

MyBits运行原理之 SqlSessionFactory的创建过程

    11.通过XPathParser对象解析了XML文件。并封装成XPathParser的一个对象


 12.然后又调用了XMLConfigBuilder的另外一个private构造方法MyBits运行原理之 SqlSessionFactory的创建过程

    12.注意这个构造方法 !!!

    第一句调用了父类的构造方法!传入参数为new Configuration()对象??

    13. 让我们看一下父类(BaseBuilder)的构造方法内容是什么

       MyBits运行原理之 SqlSessionFactory的创建过程

    14.在父类BaseBuilder中我们可以看有三个成员变量:Configuration、TypeAliasRegistry、TypeHandlerRegistry)(配置类? 别名注册类?类型处理器注册类?)

    15。接着我们回到子类XMLConfigBuilder

    继续向下看

    MyBits运行原理之 SqlSessionFactory的创建过程

    图中方框中标识的方法: 调用父类的成员变量:configuration的setVariables(props)方法;]

    15.继续我们跟进去,看一下里面都是有什么。

    MyBits运行原理之 SqlSessionFactory的创建过程

    好像给Configu'ration对象的variables变量赋值. 先不管它,继续向下分析

    MyBits运行原理之 SqlSessionFactory的创建过程

    16.这个构造方法走完了发现也没什么特殊的,但是我们要记得XMLConfigBuilder的父类BaseBuilder有一个成员变量叫做Configuration哦!!!

    MyBits运行原理之 SqlSessionFactory的创建过程

接着返回一个XmlConfiguration对象

17.向上跳回到:SqlSessionFactoryBuilder.build()方法

MyBits运行原理之 SqlSessionFactory的创建过程

    18.第50行调用了parser的parse()方法后又调用了build方法。

    我们先看看parser的parse()方法都是做了些什么吧。

    MyBits运行原理之 SqlSessionFactory的创建过程

parsed为真的话,抛出个异常? 先不管他,继续看。

19.这个方法又调用了自己对象的 parseConfiguration(parser.evalNode("/configuration"));方法;

    跟进去看一下。

       MyBits运行原理之 SqlSessionFactory的创建过程

    20.跳入这个方法,我们发现里面有好多方法。(build模式?)

   21. 其中我们重点看一下第118行的typeHandlerElement(root.evalNode("typeHandlers"));    

    从方法名和参数类型我们可以了解到,不就是从XML文件中读取到typeHandlers并处理吗。我们继续进到这个方法看一下吧。

    MyBits运行原理之 SqlSessionFactory的创建过程

22.这部分好像就是TypeHandler的解析并注册过程。不过并不是本次的主要目的,先跳过去吧。

MyBits运行原理之 SqlSessionFactory的创建过程

  23.  继续向下走,返回一个Configuration的成员变量(父类中声明的哦!)

  24.   继续向上走,回到SqlSessionFactoryBuilder.builder()方法;

MyBits运行原理之 SqlSessionFactory的创建过程

    25.接着又调用了build方法,跟进去看一下吧。

    MyBits运行原理之 SqlSessionFactory的创建过程

    26.返回了一个SqlSessionFactory的实现类的对象: new DefaultSqlSessionFactory(Configuration config);

   又是这个Configuration出现了。

   27. 我们还是进去看看这个类到底干嘛的吧。跟到Configuration类

    MyBits运行原理之 SqlSessionFactory的创建过程

MyBits运行原理之 SqlSessionFactory的创建过程

这个类中含有大量的成员变量,我们猜测这是个配置类。

MyBits运行原理之 SqlSessionFactory的创建过程

    29.构造方法中的这些代码不正是系统声明的别名吗? 所以答案就是这个就是配置类。

    既然知道Configuration是个配置类,那么

MyBits运行原理之 SqlSessionFactory的创建过程

也就可以解释了。

 在文章开头我们看到了SqlSessionFactory的继承关系。

MyBits运行原理之 SqlSessionFactory的创建过程

所以本次创建过程就完成了,

    接下来我们还是看看DefaultSqlSessionFactory这个类都是些什么变量和方法吧,跟到DefaultSqlSessionFactory类

    MyBits运行原理之 SqlSessionFactory的创建过程

    从结构图中看到,有一个成员变量Configuration(就是刚刚传入的哦)

    还有若干个OpenSession()方法。

   本次浅析就到这了,接下来的文章继续分析OpenSession过程。