1.XMLConfigBuilder

XMLConfigBuilder类位于Mybatis包的org.apache.ibatis.builder.xml目录下,继承于BaseBuilder类,关于BaseBuilder类后续再看。

XMLConfigBuilder看名字能猜到是关于mybatis的XML配置的构造类,负责构造mybatis的XML配置的。

XMLConfigBuilder共有四个属性,代码如下:

  1. private boolean parsed;//解析标识,因为Configuration是全局变量,只需要解析创建一次即可,true表示已经解析创建过,false则表示没有
  2. private XPathParser parser;
  3. private String environment;//环境参数
  4. private ReflectorFactory localReflectorFactory = new DefaultReflectorFactory();

XMLConfigBuilder共有6个public构造方法和一个private的构造方法,如下:

  1. public XMLConfigBuilder(Reader reader) {
  2. this(reader, null, null);
  3. }
  4.  
  5. public XMLConfigBuilder(Reader reader, String environment) {
  6. this(reader, environment, null);
  7. }
  8.  
  9. public XMLConfigBuilder(Reader reader, String environment, Properties props) {
  10. this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props);
  11. }
  12.  
  13. public XMLConfigBuilder(InputStream inputStream) {
  14. this(inputStream, null, null);
  15. }
  16.  
  17. public XMLConfigBuilder(InputStream inputStream, String environment) {
  18. this(inputStream, environment, null);
  19. }
  20.  
  21. public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
  22. this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
  23. }
  24.  
  25. private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
  26. super(new Configuration());//调用父类的构造方法
  27. ErrorContext.instance().resource("SQL Mapper Configuration");
  28. this.configuration.setVariables(props);
  29. this.parsed = false;
  30. this.environment = environment;
  31. this.parser = parser;
  32. }

很显然6个public的构造方法都是根据mybatis的配置文件流创建一个XPathParser对象,然后最终都调用了私有的构造方法,而私有的构造方法先是调用了父类BaseBuilder的构造方法,然后分别根据参数给四个属性赋值。

而上一篇文章提到了SqlSessionFactoryBuilder中是通过创建一个XMLConfigBuilder对象,然后调用了对象的parse()方法获取到一个Configuration对象。接下来就先看看XMLConfigBuilder的parse方法,如下:、

  1. public Configuration parse() {
  2. if (parsed) {//判断Configuration是否解析过,Configuration是全局变量,只需要解析创建一次即可
  3. throw new BuilderException("Each XMLConfigBuilder can only be used once.");
  4. }
  5. parsed = true;
  6. parseConfiguration(parser.evalNode("/configuration"));//调用下面的方法,parser.evalNode("/configuration")解析XML配置的configuration节点的内容,得到XNode对象
  7. return configuration;
  8. }
  9. //根据root中存储的是configuration节点的内容
  10. private void parseConfiguration(XNode root) {
  11. try {
  12. Properties settings = settingsAsPropertiess(root.evalNode("settings"));//设置settings配置
  13. //issue #117 read properties first
  14. propertiesElement(root.evalNode("properties"));//设置properties配置
  15. loadCustomVfs(settings);
  16. typeAliasesElement(root.evalNode("typeAliases"));//设置typeAliases配置
  17. pluginElement(root.evalNode("plugins"));//设置plugins配置
  18. objectFactoryElement(root.evalNode("objectFactory"));//设置objectFactory配置
  19. objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));//设置objectWrapperFactory配置
  20. reflectorFactoryElement(root.evalNode("reflectorFactory"));//设置reflectFactory配置
  21. settingsElement(settings);
  22. // read it after objectFactory and objectWrapperFactory issue #631
  23. environmentsElement(root.evalNode("environments"));//设置environments配置
  24. databaseIdProviderElement(root.evalNode("databaseIdProvider"));//设置databaseIdProvider配置
  25. typeHandlerElement(root.evalNode("typeHandlers"));//设置typeHandlers配置
  26. mapperElement(root.evalNode("mappers"));//设置mappers配置
  27. } catch (Exception e) {
  28. throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
  29. }
  30. }

可以看出parse的作用是解析mybatis-config.xml的configuration节点的内容,然后挨个赋值给configuration对象的属性;

而XMLConfigBuilder的其他私有方法都是给根据XNode对象(XML配置的configuration节点内容)来给全局配置变量configuration的属性进行赋值,关于Configuration类的解析下一章会解析

总结:XMLConfigBuilder类的作用是根据全局配置文件mybatis-config.xml的流文件进行解析,解析xml中的各个节点,然后创建一个Configuration对象,并将xml中的节点属性赋值给Configuration对象

mybatis源码解析3---XMLConfigBuilder解析的更多相关文章

  1. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  2. Spring mybatis源码篇章-MybatisDAO文件解析(一)

    前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-SqlSessionFactory 加载指定的mybatis主文件 Mybatis模板文件,其中的属性 ...

  3. Spring mybatis源码篇章-MybatisDAO文件解析(二)

    前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-MybatisDAO文件解析(一) 默认加载mybatis主文件方式 XMLConfigBuilder ...

  4. MyBatis源码部分简单地解析

    . 一.解析xml: > org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream, java.l ...

  5. Mybatis 源码之Plugin类解析

    public class Plugin implements InvocationHandler { private Object target; //目标对象 private Interceptor ...

  6. MyBatis 源码分析 - 配置文件解析过程

    * 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...

  7. Spring mybatis源码学习指引目录

    前言: 分析了很多方面的mybatis的源码以及与spring结合的源码,但是难免出现错综的现象,为了使源码陶冶更为有序化.清晰化,特作此随笔归纳下分析过的内容.博主也为mybatis官方提供过pul ...

  8. MyBatis 源码分析 - 插件机制

    1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...

  9. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  10. MyBatis 源码分析 - 内置数据源

    1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其 ...

随机推荐

  1. linux 查看文件目录大小

    du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>] [--max-de ...

  2. 原生js可视加载图片、延迟加载、懒加载

    <script> //既视加载//var oBtn = document.getElementsByTagName('button')[0];var aImages = document. ...

  3. MySQL 5.7 新特性大全和未来展望

    引用 美图公司数据库高级 DBA,负责美图后端数据存储平台建设和架构设计.前新浪高级数据库工程师,负责新浪微博核心数据库架构改造优化,以及数据库相关的服务器存储选型设计.之前在「高可用架构」发表的&l ...

  4. pycharm的小问题之光标

    一大早起来,突然发现pycharm的光变粗,按退格键会删除编写的内容,超级难受(如下图), 百度一下,也不知道在百度框里输什么关键字好,但最后还是找到了,哈哈.... ​ 解决方法: 1.按键盘上In ...

  5. 【BFS宽度优先搜索】

    一.求所有顶点到s顶点的最小步数   //BFS宽度优先搜索 #include<iostream> using namespace std; #include<queue> # ...

  6. Z字形扫描

    #include<cstdio> #include<iostream> #include<algorithm> #include<vector> #in ...

  7. python中的0,None,False,空容器

    在Python中,None.空列表[].空字典{}.空元组().0等一系列代表空和无的对象会被转换成False.除此之外的其它对象都会被转化成True. 1.0等于False,这点要注意. 2.空的l ...

  8. 网络编程——socket编程

    一.客户端/服务端架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网企业处处是C/S架构 C/S架构与socket的关系:学习socket就是为了完成C/S架构的开发 二.OSI七层 一个 ...

  9. 【UML】-NO.43.EBook.5.UML.1.003-【UML 大战需求分析】- 状态机图(State Machine Diagram)

    1.0.0 Summary Tittle:[UML]-NO.43.EBook.1.UML.1.003-[UML 大战需求分析]- 状态机图(State Machine Diagram) Style:D ...

  10. centos7 下 apache nginx squid https正向代理 代理服务器

    apache yum install httpd mod_ssl -y vim /etc/httpd/conf.d/ssl.conf Listen https <VirtualHost *:&g ...