文档章节

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

傳_奇
 傳_奇
发布于 2015/07/16 10:19
字数 992
阅读 61
收藏 0

一、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();

 

© 著作权归作者所有

傳_奇
粉丝 2
博文 5
码字总数 5851
作品 0
南京
私信 提问
Mybatis的SqlSession运行原理

前言   SqlSession是Mybatis最重要的构建之一,可以简单的认为Mybatis一系列的配置目的是生成类似 JDBC生成的Connection对象的SqlSession对象,这样才能与数据库开启“沟通”,通过SqlSess...

JJian
2018/08/10
0
0
Mybatis源码学习(一)-整体框架理解

一、对源码先上一个结构图: 源代码主要在org.apache.ibatis目录下,18个包,其中在应用中主要的包有:builder、session、cache、type、transaction、datasource、jdbc、mapping,提供支撑服...

飓风2000
2014/07/22
9.5K
0
当面试官问我Mybatis初始化原理时,我笑了

对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。本章将通过以下几点详细介绍MyBatis的初始化过程。 MyBatis的初始化做了什么 MyBatis基于XML配置文件创建Configurati...

java菜分享
01/29
33
0
《深入理解mybatis原理》 Mybatis初始化机制详解

对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。本章将通过以下几点详细介绍MyBatis的初始化过程。 1.MyBatis的初始化做了什么 2. MyBatis基于XML配置文件创建Configu...

jason_wu_2
2016/12/01
305
1
MyBatis源码学习(二)-Configuration对象理解

一、Configuration对象主要数据结构: 1. protected Properties variables = new Properties();//全局属性配置对象 2.protected final TypeAliasRegistry typeAliasRegistry = new TypeAlia......

飓风2000
2014/07/24
2.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
40分钟前
48
0
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
9
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部