// BaseBuilder属性

public abstract class BaseBuilder {
  //需要配置,类型别名注册,类型处理器注册3个东西
  protected final Configuration configuration;
  protected final TypeAliasRegistry typeAliasRegistry;
  protected final TypeHandlerRegistry typeHandlerRegistry;
}

public class XMLConfigBuilder extends BaseBuilder{},可见XMLConfigBuilder继承自BaseBuilder

// XMLConfigBuilder属性
public class XMLConfigBuilder extends BaseBuilder {

  //是否已解析
  private boolean parsed;
  // XPath解析器
  private XPathParser parser;

  // 当前环境
  private String environment;
}

SqlSessionFactoryBuilder调用XMLConfigBuilder的parse()函数

//   
//   
//   
//   
//   
//   
//   
//   
//   
//   
//   
//   
//   
//  
//   
//   
//   
//  

  //解析配置
  public Configuration parse() {
    //如果已经解析过了,报错
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;

    //根节点是configuration
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

通过源码可以看到parse()函数实际上是调用的parseConfiguration()函数,内部实现如下:

private void parseConfiguration(XNode root) {
  try {
    //分步骤解析
    //issue #117 read properties first
    //1.properties
    propertiesElement(root.evalNode("properties"));
    //2.类型别名
    typeAliasesElement(root.evalNode("typeAliases"));
    //3.插件
    pluginElement(root.evalNode("plugins"));
    //4.对象工厂
    objectFactoryElement(root.evalNode("objectFactory"));
    //5.对象包装工厂
    objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
    //6.设置
    settingsElement(root.evalNode("settings"));
    // read it after objectFactory and objectWrapperFactory issue #631
    //7.环境
    environmentsElement(root.evalNode("environments"));
    //8.databaseIdProvider
    databaseIdProviderElement(root.evalNode("databaseIdProvider"));
    //9.类型处理器
    typeHandlerElement(root.evalNode("typeHandlers"));
    //10.映射器
    mapperElement(root.evalNode("mappers"));
  } catch (Exception e) {
    throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
  }
}

以上函数为mybatis对于配置文件的关键节点进行解析处理.

  • propertiesElement(XNode context)
//
//    
//    
//
  • typeAliasesElement(XNode context)
//
//  
//  
//  
//  
//  
//  
//
  • pluginElement(XNode context)
  //MyBatis 允许你在某一点拦截已映射语句执行的调用。默认情况下,MyBatis 允许使用插件来拦截方法调用
//
//  
//    
//  
//  
  • objectFactoryElement(XNode context)
//
//  
//
  • objectWrapperFactoryElement(XNode context)
  • settingsElement(XNode context)
//
//  
//  
//  
//  
//  
//  
//  
//  
//  
//  
//  
//  
//  
//
  • environmentsElement(XNode context)
//  
//    
//      
//        
//      
//      
//        
//        
//        
//        
//      
//    
//  
  • databaseIdProviderElement(XNode context)
//  
//    
//            
//    
//  
  • typeHandlerElement(XNode context)
//  
//    
//  
  • mapperElement(XNode context)
//  1.使用类路径
//  
//    
//    
//    
//  
//
//  2.使用绝对url路径
//  
//    
//    
//    
//  
//
//  3.使用java类名
//  
//    
//    
//    
//  
//
//  4.自动扫描包下所有映射器
//  
//    
//