Mybatis源码分析(一):初始化构建过程

243 阅读2分钟

核心步骤

从构建阶段的入口类 SqlSessionFactoryBuilder开始

  1. 首先,Xml**Builder类是构建器,用来构建一个对象
  2. XMLConfigBuilder的产物用来加载MyBatis的配置文件
  3. XMLMapperBuilder的产物用来解析MyBatis中的映射文件
  4. XMLStatementBuilder的产物用来解析映射文件中的SQL语句

SqlSessionFactoryBuilder

XMLConfigBuilder

XMLMapperBuilder

// 几个Builder的创建顺序
SqlSessionFactoryBuilder#build()    // sql会话工厂构建器
        new XMLConfigBuilder        // 配置构建器
            new XMLMapperBuilder    // Mapper构建器
                new XMLStatementBuilder         // sql语句构建器
        new DefaultSqlSessionFactory(config)    // 得到configuration对象后构建出工厂类
  • 这些XML建造者都有一个共同的父类BaseBuilder
  • 这个BaseBuilder父类维护了一个全局的Configuration对象,
  • MyBatis的配置文件解析后就以Configuration对象的形式存储。
  • 当创建XMLConfigBuilder对象时,就会初始化Configuration对象,
  • 并且在初始化Configuration对象时,一些别名会注册到Configuration的typeAliasRegistry容器中。

XmlConfigBuilder初始化构建Configuration的过程

XmlConfigBuilder

XPathParser

XmlConfigBuilder

XmlConfigBuilder加载配置文件到Configuration的细节

mybatis-config.dtd 规定了Configuration配置的内容
Configuration 对象是XmlConfigBuilder构建产物,但是他的运行环境EnvironmentSQL映射依赖了其他的builder

SqlSessionFactoryBuilder初始化后调用XmlConfigBuilder.parse()方法将配置文件初始化到configuration
XmlConfigBuilder多次用XPathParser.evalNode()方法来获取xml document对象的DOM节点

XMLMapperBuilder配置的初始化

mybatis-3-mapper.dtd定义了SQL Mapper配置文件的内容,都是与增删改查相关的 SQL Mapper配置内容也是被保存在Confiuration对象中

XMLConfigBuilder.java

解析SQL Mapper有三个方式,
如果是resource方式或者url方式,会直接调用XMLMapperBuilder.parse()进行构建
如果是扫描包或者指定类的方式,则会使用MapperAnnoationBuilder反射解析Mapper类中的注解,进行构建

addMapper

addMapper

XMLMapperBuilder加载sql mapper配置文件的细节

XMLMapperBuilder.parse()Mapper注册到configuration对象中

MapperAnnoationBuilder加载Mapper接口上的注解

MapperAnnoationBuilderXMLMapperBuilder有些类似,不过构建的内容略少,且需要使用反射来构建SQL Mapper
MapperAnnoationBuilder只处理cache、cacheRef和statement配置

总结

Configuration对象的先对mybatis的配置初始化,然后会进行Sql Mapper映射文件的初始化。

Sql语句的构建中实现了语句、参数、主键、返回结果集和缓存的加载,加载完的语句变量都会保存在configuration中。

下篇文章中,我们来对myabtis运行阶段进行分析。