MybatisSqlSessionFactory启动原理

在这里插入图片描述

详细步骤

调用sqlSessionFactoryBuilder类的build方法,然后从return build(parser.parse());进入
XMLConfigBuilder类的parse方法

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
  try {
    XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
    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.
    }
  }
}

XMLConfigBuilder类的parse,从parseConfiguration(parser.evalNode("/configuration"));进入parseConfiguration方法

public Configuration parse() {
  if (parsed) {
    throw new BuilderException("Each XMLConfigBuilder can only be used once.");
  }
  parsed = true;
  parseConfiguration(parser.evalNode("/configuration"));
  return configuration;
}

parseConfiguration 从这里可以看见Mybatis的配置文件中各项信息
【settings】【mapperElement】等等

private void parseConfiguration(XNode root) {
  try {
    Properties settings = settingsAsPropertiess(root.evalNode("settings"));
    //issue #117 read properties first
    propertiesElement(root.evalNode("properties"));
    loadCustomVfs(settings);
    typeAliasesElement(root.evalNode("typeAliases"));
    pluginElement(root.evalNode("plugins"));
    objectFactoryElement(root.evalNode("objectFactory"));
    objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
    reflectorFactoryElement(root.evalNode("reflectorFactory"));
    settingsElement(settings);
    // read it after objectFactory and objectWrapperFactory issue #631
    environmentsElement(root.evalNode("environments"));
    databaseIdProviderElement(root.evalNode("databaseIdProvider"));
    typeHandlerElement(root.evalNode("typeHandlers"));
    mapperElement(root.evalNode("mappers"));
  } catch (Exception e) {
    throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
  }
}

现在基本上已经进入轨道了,接下来不在插入代码块了,纯文字构画出过程:
从XMLConfigBuilder中parseConfiguration方法中进入mapperElement[映射文件信息]
在mapperElement方法中将根据配置文件中的< mappers >的注册方式分两种情况
1、以包形式注册
mapperElement方法中configuration.addMappers()方法,经过各种解析,筛选出需要的xml映射文件【省略其中步骤】---->MapperRegistry类中addMapper方法中parser.parse()【创建解析】—>MapperAnnotationBuilder类parse方法中loadXmlResource【开始解析xml映射文件】---->XMLMapperBuilder类parse方法中configurationElement(parser.evalNode("/mapper"));
---->XMLMapperBuilder类configurationElement方法中buildStatementFromContext【准备解析CRUD操作】buildStatementFromContext方法statementParser.parseStatementNode()【解析CRUD方法的参数】---->
XMLStatementBuilder类parseStatementNode方法【所有参数解析后调用】
---->builderAssistant类中addMappedStatement方法【将MappedStatement添加到configuration中】【每一个MappedStatement对应一条SQL语句】
---->XMLMapperBuilder类parse方法【将configuration进行返回】
2、非包形式注册
XMLConfigBuilder类mapperElement方法中mapperParser.parse();–>XMLMapperBuilder类parse[configurationElement(parser.evalNode("/mapper"));
–>XMLMapperBuilder类configurationElement方法中buildStatementFromContext【准备解析CRUD操作】buildStatementFromContext方法statementParser.parseStatementNode()【解析CRUD方法的参数】---->
XMLStatementBuilder类parseStatementNode方法【所有参数解析后调用】
---->builderAssistant类中addMappedStatement方法【将MappedStatement添加到configuration中】【每一个MappedStatement对应一条SQL语句】
---->XMLMapperBuilder类parse方法【将configuration进行返回】
**

  1. ---->代表执行顺序,文字叙述不易读,如果读不懂的话,可以在这些类中的方法上加断点,执行一遍。
  2. 高亮处是两种方式的不同点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值