首页 > 其他 > 详细

MyBatis加载的核心 3 大流程总结

时间:2019-08-28 23:12:54      阅读:65      评论:0      收藏:0      [点我收藏+]

1.读取所有的xml配置文件(注意,和MyBatis有关的所有配置文件

   1.1主要流程:

    去取xml配置文件(包括了mybatis-config.xml和mapper.xml)和注解中的配置信息,创建配置对象(Configuration ),并完成各个模块的初始化工作,(在创建该对象的过程中,使用了建造者模式,关于建造者模式的话,需要在设计模式的工程中详细介绍);

    首先我们看看,在创建 SqlSessionFactory 的时候,创建了创建配置对象(Configuration ),我们看下面的代码:

 String path = "mybatis-config.xml";
 InputStream stream = Resources.getResourceAsStream(path);
 // 1.读取mybatis配置文件创SqlSessionFactory
 sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
new SqlSessionFactoryBuilder()根据名字我们可以看出来,已经在使用建造者模式了,这不是我们关注的重点,下面我们键入到sqlSessionFactory 的build(stream)方法;
public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
}

我们只看主流程,没用的就先删掉了
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
    XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);//读取配置文件
    return build(parser.parse());//解析配置文件得到configuration对象,并返回SqlSessionFactory 
  } catch (Exception e) {
} finally {
ErrorContext.instance().reset();
try {inputStream.close();} catch (IOException e) {}
}
}

下面我们开始看 build()方法 中的 parser.parse()

 

public class XMLConfigBuilder extends BaseBuilder {

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

private void parseConfiguration(XNode root) {
  try {
    //issue #117 read properties first
   //解析<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"));
    //解析<objectWrapperFactory>节点
    objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
    //解析<reflectorFactory>节点
    reflectorFactoryElement(root.evalNode("reflectorFactory"));
    settingsElement(settings);//将settings填充到configuration
    // read it after objectFactory and objectWrapperFactory issue #631
    //解析<environments>节点
    environmentsElement(root.evalNode("environments"));
    //解析<databaseIdProvider>节点
    databaseIdProviderElement(root.evalNode("databaseIdProvider"));
    //解析<typeHandlers>节点
    typeHandlerElement(root.evalNode("typeHandlers"));
    //解析<mappers>节点
    mapperElement(root.evalNode("mappers"));
  } catch (Exception e) {
    throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
  }
}
}

MyBatis加载的核心 3 大流程总结

原文:https://www.cnblogs.com/lys-lyy/p/11427083.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!