MyBatis源码学习(二)-Configuration对象理解

1、Configuration对象主要数据结构:
1. protected Properties variables = new Properties();//全局属性配置对象
2.protected final TypeAliasRegistry typeAliasRegistry = new TypeAliasRegistry();//别名对应容器
3.protected final InterceptorChain interceptorChain = new InterceptorChain();这个没看懂是干什么的
4.protected ObjectFactory objectFactory = new DefaultObjectFactory();//对象建立工厂
5.protected ObjectWrapperFactory objectWrapperFactory = new DefaultObjectWrapperFactory();//对象包装工厂
6.protected Environment environment;//存放当前环境信息的对象
7.protected String databaseId;//数据库id,这点尚未搞清楚
8.protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();//存放类型处理器的容器
9.protected final Set<String> loadedResources = new HashSet<String>();//存放mapper对象的容器java

 

2、构造准备工做
XMLConfigBuilder对象接收xml配置文件的inputStream,默认环境、属性配置文件内容
XMLConfigBuilder创造了一个XPathParser对象,接收XMLConfigBuilder的inputStream,并缓存传入属性配置文件内容、xml配置文件描述dtd定义
XMLConfigBuilder创造了一个Configuration对象,并把属性配置文件内容传给这个Configuration对象
XMLConfigBuilder最终存储的是Configuration对象(typeAliasRegistry、languageRegistry、Properties)、默认环境、xml对应的XPathParser解析对象
3、解析xml文件
XMLConfigBuilder对象进行具体的工做。
经过XPathParser对象的evalNode方法,从Configuration跟节点开始遍历解析,获得顶级Node,创造出一个XNode,并把属性配置文件内容赋值给这个XNode(evalNode方法就是根据Node的名称获得XNode对象)
XMLConfigBuilder对象的parseConfiguration方法从顶级Node进行解析
1.对properties进行解析
a.Properties defaults = context.getChildrenAsProperties();先加载configuration文件中的property属性
b.Resources.getResourceAsProperties(resource);加载properties文件中的属性
c.Properties vars = configuration.getVariables();加载用户java代码的配置信息属性信息
d.全部的属性信息都保存到Configuration对象的(Properties variables)容器中(HashTable)
2.对typeAliases进行解析
a.在Configuration对象的默认构造方法中已经将Mybatis内置的别名信息加载到typeAliasRegistry容器中
b.XMLConfigBuilder对象的typeAliasRegistry.registerAlias(alias, clazz);将用户自定义别名信息加载到typeAliasRegistry容器中(Map)
3.对plugins进行解析
a. configuration.addInterceptor(interceptorInstance);将配置的plugins加载的Configuration的InterceptorChain容器中(List)
4.对objectFactory进行解析
a.对象工厂,context.getChildrenAsProperties();获得配置文件的name和value信息对
b. ObjectFactory factory = (ObjectFactory) resolveClass(type).newInstance();factory.setProperties(properties);建立对象工厂,并将属性信息传给他
c.把这个对象工厂加载到Configuration中的objectFactory对象,若是没有配置,采用默认的DefaultObjectFactory
5.对objectWrapperFactory进行解析
a.ObjectWrapperFactory factory = (ObjectWrapperFactory) resolveClass(type).newInstance();建立对象包装工程
b.configuration.setObjectWrapperFactory(factory);若是没有配置采用默认的DefaultObjectWrapperFactory
6.对settings进行解析
a.为Configuration对象的内置参数进行赋值操做,23个属性值
7.对environments进行解析
a.若是用户在初始化Configuration对象时没有传入环境信息对象,获取xml文件中配置的默认环境id
b.根据默认配置的id,加载环境信息对象,主要是加载transactionManager和dataSource信息,这里主要使用了TransactionFactory、DataSourceFactory、DataSource、 Environment.Builder 对象
     TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
          DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));
          DataSource dataSource = dsFactory.getDataSource();
          Environment.Builder environmentBuilder = new Environment.Builder(id)
              .transactionFactory(txFactory)
              .dataSource(dataSource);
c.将环境变量赋值给Configuration对象configuration.setEnvironment(environmentBuilder.build());
8.对databaseIdProvider进行解析
a.若是有配置读取配置, databaseIdProvider = (DatabaseIdProvider) resolveClass(type).newInstance(); databaseIdProvider.setProperties(properties);并为其加载属性信息
b.若是环境变量中已经有配置,须要优先考虑环境变量中的配置
  Environment environment = configuration.getEnvironment();
    if (environment != null && databaseIdProvider != null) {
      String databaseId = databaseIdProvider.getDatabaseId(environment.getDataSource());
      configuration.setDatabaseId(databaseId);
    }
9.对typeHandlers进行解析
a.typeHandlerRegistry类已经默认加载了数据库字段对应java基本类型的处理行为
b.XMLConfigBuilder对象的typeHandlerRegistry.register(javaTypeClass, jdbcType, typeHandlerClass);将自定义类型处理器加载到Configuration对象的typeHandlerRegistry容器中(Map)
10.对mappers进行解析
a.根据mapper节点配置的mapper.xml文件路径进行对象信息加载
b.将mapper.xml文件映射成对象,并保存到Configuration对象中
      InputStream inputStream = Resources.getResourceAsStream(resource);
            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
            mapperParser.parse();数据库

相关文章
相关标签/搜索