MyBatis源码笔记(二) -- Configuration类

Configuration是一个贯穿mybatis执行流程的一个类,它记录着所有配置信息,代理类、缓存、插件等等

下面列出一些属性

public class Configuration {
	  //默认不用驼峰转换
	  protected boolean mapUnderscoreToCamelCase = false;
	  //默认禁用允许延时加载
	  protected boolean aggressiveLazyLoading = true;
	  //默认允许单一语句返回多结果集
	  protected boolean multipleResultSetsEnabled = true;
  		  //默认不允许JDBC支持自动生成主键
	  protected boolean useGeneratedKeys = false;
	  //使用列标签代替列名
	  protected boolean useColumnLabel = true;
	  //默认启用缓存
	  protected boolean cacheEnabled = true;
	  //默认为SIMPLE执行器,就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新
	  protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
	  //指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。
	  protected AutoMappingBehavior autoMappingBehavior = AutoMappingBehavior.PARTIAL;
	  //---------以上都是<settings>节点-------
		...

	  //对象工厂和对象包装器工厂
	  protected ObjectFactory objectFactory = new DefaultObjectFactory();
	  protected ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory();
	  //映射注册机,对应<mappers>节点
 		  protected MapperRegistry mapperRegistry = new MapperRegistry(this);
	  //插件,对应<plugins>节点
	  protected final InterceptorChain interceptorChain = new InterceptorChain();
	  //类型处理器注册机,对应<typeHandlers>节点
	  protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
	  //类型别名注册机,对应<typeAliases>节点
	  protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();
	  //脚本语言注册器
	  protected final LanguageDriverRegistry languageRegistry = new LanguageDriverRegistry();
	  //映射的语句,存在Map里
	  protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
	  //缓存,存在Map里
	  protected final Map<String, Cache> caches = new StrictMap<Cache>("Caches collection");
	  //结果映射,存在Map里
	  protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>("Result Maps collection");
	//下面这些用于解决在顺序解析资源时,有一些引用依赖还没被解析到,所以无法完成解析,所以先缓存起来之后再解析
	  //不完整的SQL语句
	  protected final Collection<XMLStatementBuilder> incompleteStatements = new LinkedList<XMLStatementBuilder>();
	  protected final Collection<CacheRefResolver> incompleteCacheRefs = new LinkedList<CacheRefResolver>();
	  protected final Collection<ResultMapResolver> incompleteResultMaps = new LinkedList<ResultMapResolver>();
	  protected final Collection<MethodResolver> incompleteMethods = new LinkedList<MethodResolver>();
}

无参构造方法则是注册了常用别名和语言驱动

public Configuration() {
    //注册更多的类型别名
	//事务类型
    typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
    typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);
	//dataSource类型
    typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
    typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
    typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);
	//缓存策略
    typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class);
    typeAliasRegistry.registerAlias("FIFO", FifoCache.class);
    typeAliasRegistry.registerAlias("LRU", LruCache.class);
    typeAliasRegistry.registerAlias("SOFT", SoftCache.class);
    typeAliasRegistry.registerAlias("WEAK", WeakCache.class);
	//支持多厂商特性
    typeAliasRegistry.registerAlias("DB_VENDOR", VendorDatabaseIdProvider.class);

    typeAliasRegistry.registerAlias("XML", XMLLanguageDriver.class);
    typeAliasRegistry.registerAlias("RAW", RawLanguageDriver.class);
	//日志相关
    typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class);
    typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class);
    typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class);
    typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class);
    typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class);
    typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class);
    typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class);
	//代理相关
    typeAliasRegistry.registerAlias("CGLIB", CglibProxyFactory.class);
    typeAliasRegistry.registerAlias("JAVASSIST", JavassistProxyFactory.class);
	//脚本语言注册
    languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class);
    languageRegistry.register(RawLanguageDriver.class);
}

而在typeAliasRegistry在无参构造方法里已经注册了一些常用类型的别名映射

public TypeAliasRegistry() {
//构造函数里注册系统内置的类型别名
   registerAlias("string", String.class);

//基本包装类型
   registerAlias("byte", Byte.class);
   registerAlias("long", Long.class);
   registerAlias("short", Short.class);
   registerAlias("int", Integer.class);
   ...

//基本数组包装类型
   registerAlias("byte[]", Byte[].class);
   registerAlias("long[]", Long[].class);
   ...

//加个下划线,就变成了基本类型
   registerAlias("_byte", byte.class);
   registerAlias("_long", long.class);
   ...

//加个下划线,就变成了基本数组类型
   registerAlias("_byte[]", byte[].class);
   registerAlias("_long[]", long[].class);
   ...

//日期数字型
   registerAlias("date", Date.class);
   ...

   registerAlias("date[]", Date[].class);
   ...

//集合型
   registerAlias("map", Map.class);
   registerAlias("hashmap", HashMap.class);
   registerAlias("list", List.class);
   registerAlias("arraylist", ArrayList.class);
   registerAlias("collection", Collection.class);
   registerAlias("iterator", Iterator.class);

//还有个ResultSet型
   registerAlias("ResultSet", ResultSet.class);
  }

还有几个new开头的方法比较重要,后续笔记在一一分析。

Configuration#newXXX

猜你喜欢

转载自blog.csdn.net/seasonLai/article/details/82853822