Mybatis的执行流程(配置文件加载)

172 阅读1分钟

MyBatis的配置文件的加载

以下是Mybatis中从xml文件中加载并构造的开头:

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);

new SqlSessionFactoryBuilder()中的build()方法接受了来自xml文件的输入流

而build()方法将指向build(InputStream inputStream, String environment, Properties properties):

  
  public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      //通过输入流构造一个XML配置的解析器
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      //XMLConfigBuilder.parse()方法将返回一个Configuration对象,代表XML中的配置
      //build() 方法根据Configuration对象构造一个DefaultSqlSessionFactory实例
      return build(parser.parse());
    } catch (Exception e) {
      ...
    } finally {
      ...
    }
  }

parse()方法如下,职责是解析XML配置文件:

  public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    //parseConfiguration()方法,从配置文件的‘configuration’进入(根节点)
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

parseConfiguration(XNode root)方法完成configuration节点下的所有节点的读取配置

这里可以稍微看一下官网对configuration的定义,而parseConfiguration能够解析这些配置。

为了方便,我在这里列出所有待解析的节点:

  • configuration(配置)
  • properties(属性)
  • settings(设置)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境配置)
    • environment(环境变量)
      • transactionManager(事务管理器)
      • dataSource(数据源)
  • databaseIdProvider(数据库厂商标识)
  • mappers(映射器)

对照所有带解析的配置节点,查看源码中的解析: 注意所有以Element结尾的方法,其传入值都是一个节点,也就是root的某个子节点:root.eval(String expression)能取到root的下一个指定名称的节点。

private void parseConfiguration(XNode root) {
    try {
      //先行解析properties节点
      propertiesElement(root.evalNode("properties"));
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      loadCustomVfs(settings);
      loadCustomLogImpl(settings);
      
      typeAliasesElement(root.evalNode("typeAliases"));
      
      pluginElement(root.evalNode("plugins"));
      
      objectFactoryElement(root.evalNode("objectFactory"));
      
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      
      settingsElement(settings);
      
      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);
    }
  }