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

一、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对象的容器

 

二、构造准备工作
XMLConfigBuilder对象接收xml配置文件的inputStream,默认环境、属性配置文件内容
XMLConfigBuilder创造了一个XPathParser对象,接收XMLConfigBuilder的inputStream,并缓存传入属性配置文件内容、xml配置文件描述dtd定义
XMLConfigBuilder创造了一个Configuration对象,并把属性配置文件内容传给这个Configuration对象
XMLConfigBuilder最终存储的是Configuration对象(typeAliasRegistry、languageRegistry、Properties)、默认环境、xml对应的XPathParser解析对象
三、解析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();

 

你可能感兴趣的:(MyBatis源码学习(二)-Configuration对象理解)