Mybatis初始化流程分析--转载整理


参考:
深入理解mybatis原理 - Mybatis初始化机制详解
Mybatis源码解读-初始化过程详解
MyBatis源码解析(一)——MyBatis初始化过程解析

一.Mybatis初始化做了什么

MyBatis采用了一个非常直白和简单的方式—使用 org.apache.ibatis.session.Configuration 对象作为一个所有配置信息的容器
Configuration对象的组织结构和XML配置文件的组织结构几乎完全一样(当然,Configuration对象的功能并不限于此,它还负责创建一些MyBatis内部使用的对象,如Executor等)

二.Configration对象

1.configuration 配置

  • properties 属性
  • settings 设置
  • typeAliases 类型命名
  • typeHandlers 类型处理器
  • objectFactory 对象工厂
  • plugins 插件
  • environments 环境
  • environment 环境变量
  • transactionManager 事务管理器
  • dataSource 数据源
  • 映射器

2.Configration结构

            在这里插入图片描述
   MyBatis根据初始化好Configuration信息,这时候用户就可以使用MyBatis进行数据库操作了。
   可以这么说,MyBatis初始化的过程,就是创建 Configuration对象的过程。

3.Configration配置方式

  • 基于XML配置文件:基于XML配置文件的方式是将MyBatis的所有配置信息放在XML文件中,MyBatis通过加载并XML配置文件,将配置文信息组装成内部的Configuration对象
  • 基于Java API:这种方式不使用XML配置文件,需要MyBatis使用者在Java代码中,手动创建Configuration对象,然后将配置参数set 进入Configuration对象中

三.Configration对象的初始化流程

1.代码解析过程分析

A.获取配置文件

当系统初始化时,首先会读取配置文件,并将其解析成InputStream

B.创建SqlSessionFactoryBuilder对象

                 在这里插入图片描述

SqlSessionFactoryBuilder中只有一些重载的build函数,这些build函数的入参都是MyBatis配置文件的输入流,返回值都是SqlSessionFactory;
由此可见,SqlSessionFactoryBuilder的作用很纯粹,就是用来通过配置文件创建SqlSessionFactory对象的。

C.创建SqlSessionFactory

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
   
  try {
   
    //!!! 通过传入的配置流文件 去生成 XMLConfigBuilder
    XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
    
    //!!! 先通过XMLConfigBuilder去parse解析文件流,然后再创建SqlSessionFactory对象
    return build(parser.parse());
  } catch (Exception e) {
   
    throw ExceptionFactory.wrapException("Error building SqlSession.", e);
  } finally {
   
    ErrorContext.instance().reset();
    try {
   
      inputStream.close();
    } catch (IOException e) {
   
      // Intentionally ignore. Prefer previous error.
    }
  }
}
1.构造XMLConfigBuilder对象

                   在这里插入图片描述

XMLxxxBuilder是用来解析XML配置文件的,不同类型XMLxxxBuilder用来解析MyBatis配置文件的不同部位。比如:XMLConfigBuilder用来解析MyBatis的配置文件,XMLMapperBuilder用来解析MyBatis中的映射文件(如上文提到的ProductMapper.xml),XMLStatementBuilder用来解析映射文件中的SQL语句。

这些XMLxxxBuilder都有一个共同的父类——BaseBuilder。这个父类维护了一个全局的Configuration对象,MyBatis的配置文件解析后就以Configuration对象的形式存储。

2.解析配置文件
  private void parseConfiguration(XNode root) {
   
  try {
   
    // 解析<properties>节点
    propertiesElement(root.evalNode("properties"));
    // 解析<settings>节点
    Properties settings = settingsAsProperties(root.evalNode("settings"));
    loadCustomVfs(settings);
    // 解析<typeAliases>节点
    typeAliasesElement(root.evalNode("typeAliases"));
    // 解析<plugins>节点
    pluginElement(root.evalNode("plugins"));
    // 解析<objectFactory>节点
    objectFactoryElement(root.evalNode("objectFactory"));
    objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
    // 解析<reflectorFactory>节点
    reflectorFactoryElement(root.evalNode("reflectorFactory"));
    settingsElement(settings);
    // 解析<environments>节点
    environmentsElement(root.evalNode("environments"));
    databaseIdProviderElement(root.evalNode("databaseIdProvider"));
    typeHandlerElement(root.evalNode("typeHandlers"));
    // 解析<mappers>节点
    mapperElement(root.evalNode("mappers"));
  } catch (Exception e) {
   
    throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
  }
}

A.properties节点的解析
/**
  * @Param context <properties>节点
  */
private void propertiesElement(XNode context) throws Exception {
   
  if (context != null) {
   
    // 获取<properties>节点的所有子节点
    Properties defaults = context.getChildrenAsProperties();
    // 获取<properties>节点上的resource属性
    String resource = context.getStringAttribute("resource");
    // 获取<properties>节点上的url属性
    String url = context.getStringAttribute("url");
    // resource和url不能同时存在
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了-凡

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值