Mybatis源码分析六之Configration

介绍

Configuration保存了所有Myabtis中的配置,包括两部分
- mybaits-config.xml
- UserMapper.xml

中所有配置信息都可以在Configruation对象中找到相应的信息。

Configration.java

从mybati-config.xml中加载的配置

public class Configuration {
protected boolean safeRowBoundsEnabled = false;  
protected boolean safeResultHandlerEnabled = true;  
protected boolean mapUnderscoreToCamelCase = false;  
protected boolean aggressiveLazyLoading = true;  
protected boolean multipleResultSetsEnabled = true;  
protected boolean useGeneratedKeys = false;  
protected boolean useColumnLabel = true;  
protected boolean cacheEnabled = true;  
protected boolean callSettersOnNulls = false;  
protected String logPrefix;  
protected Class <? extends Log> logImpl;  
protected LocalCacheScope localCacheScope = LocalCacheScope.SESSION;  
protected JdbcType jdbcTypeForNull = JdbcType.OTHER;  
protected Set<String> lazyLoadTriggerMethods = new HashSet<String>(Arrays.asList(new String[] { "equals", "clone", "hashCode", "toString" }));  
protected Integer defaultStatementTimeout;  
protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;  
protected AutoMappingBehavior autoMappingBehavior = AutoMappingBehavior.PARTIAL;  

protected Properties variables = new Properties();  
protected ObjectFactory objectFactory = new DefaultObjectFactory();  
protected ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory();  
protected MapperRegistry mapperRegistry = new MapperRegistry(this);  

protected boolean lazyLoadingEnabled = false;  
protected ProxyFactory proxyFactory;  
//插件链表,这个类似java web的Filter处理模式
protected final InterceptorChain interceptorChain = new InterceptorChain();  
protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();  
protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();  
protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry(); 
...

}

比如配置:

<settings>  
  <setting name="cacheEnabled" value="true"/>  
  <setting name="lazyLoadingEnabled" value="true"/>  
  <setting name="multipleResultSetsEnabled" value="true"/>  
  <setting name="useColumnLabel" value="true"/>  
  <setting name="useGeneratedKeys" value="false"/>  
  <setting name="autoMappingBehavior" value="PARTIAL"/>  
  <setting name="defaultExecutorType" value="SIMPLE"/>  
  <setting name="defaultStatementTimeout" value="25"/>  
  <setting name="defaultFetchSize" value="100"/>  
  <setting name="safeRowBoundsEnabled" value="false"/>  
  <setting name="mapUnderscoreToCamelCase" value="false"/>  
  <setting name="localCacheScope" value="SESSION"/>  
  <setting name="jdbcTypeForNull" value="OTHER"/>  
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>  
</settings>  

从mapper中加载配置

protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");  

protected final Map<String, Cache> caches = new StrictMap<Cache>("Caches collection");  
protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>("Result Maps collection");  
protected final Map<String, ParameterMap> parameterMaps = new StrictMap<ParameterMap>("Parameter Maps collection");  
protected final Map<String, KeyGenerator> keyGenerators = new StrictMap<KeyGenerator>("Key Generators collection"); 

加载

是在SqlSessionFactory初始化阶段加载。

SqlSessionFactoryBuilder.java 解析入口
 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.java中

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 {
    //数据库连接相关属性
      propertiesElement(root.evalNode("properties")); //issue #117 read properties first
      typeAliasesElement(root.evalNode("typeAliases"));
      //拦截器解析
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      settingsElement(root.evalNode("settings"));
      environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631
      //解析自定义类型转换器
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      typeHandlerElement(root.evalNode("typeHandlers"));
      //这里解析Mapper.xml
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }

关于配置文件的解析,这里就暂不分析了

参考

Mybatis3源码分析(02)-加载Configuration-XMLConfigBuilder

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值