MyBatis源码学习--配置文件的加载

先从XmlConfigBuilder开始

private void parseConfiguration(XNode root) {
  try {
    this.propertiesElement(root.evalNode("properties"));
    this.typeAliasesElement(root.evalNode("typeAliases"));
    this.pluginElement(root.evalNode("plugins"));
    this.objectFactoryElement(root.evalNode("objectFactory"));
    this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
    this.reflectionFactoryElement(root.evalNode("reflectionFactory"));
    this.settingsElement(root.evalNode("settings"));
    this.environmentsElement(root.evalNode("environments"));
    this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));
    this.typeHandlerElement(root.evalNode("typeHandlers"));
    this.mapperElement(root.evalNode("mappers"));
  } catch (Exception var3) {
  throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3);
  }
}

上面的代码加载mybatis-config.xml中的各个字节点的内容,以this.propertiesElement(root.evalNode("properties")), 其中具体的内容是

private void propertiesElement(XNode context) throws Exception {    if(context != null) {        Properties defaults = context.getChildrenAsProperties();        String resource = context.getStringAttribute("resource");        String url = context.getStringAttribute("url");        if(resource != null && url != null) {            throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference.  Please specify one or the other.");        }

if(resource != null) {            defaults.putAll(Resources.getResourceAsProperties(resource));        } else if(url != null) {            defaults.putAll(Resources.getUrlAsProperties(url));        }

Properties vars = this.configuration.getVariables();        if(vars != null) {            defaults.putAll(vars);        }

this.parser.setVariables(defaults);        this.configuration.setVariables(defaults);    }

}

其功能是获取<properties resource="mysql-config.properties" />的内容, 其中resource和URL不能并存,否则就会抛出异常,因为加载数据库相关信息有两种方式,所以根据if判断进入不同的信息,其他的标签也类似。接下来跟踪defaults.putAll(Resources.getResourceAsProperties(resource));具体的内容是
public static Properties getResourceAsProperties(String resource) throws IOException {    Properties props = new Properties();    InputStream in = getResourceAsStream(resource);    props.load(in);    in.close();    return props;}

结果是返回引入的properties文件的内容,然后保存可用的信息。
 
时间: 2024-10-08 10:01:49

MyBatis源码学习--配置文件的加载的相关文章

【MyBatis源码分析】Configuration加载(上篇)

config.xml解析为org.w3c.dom.Document 本文首先来简单看一下MyBatis中将config.xml解析为org.w3c.dom.Document的流程,代码为上文的这部分: 1 static { 2 try { 3 reader = Resources.getResourceAsReader("mybatis/config.xml"); 4 ssf = new SqlSessionFactoryBuilder().build(reader); 5 } 6 c

Mybatis源码学习记录

一.对源码先上一个结构图: 源代码主要在org.apache.ibatis目录下,18个包,其中在应用中主要的包有:builder.session.cache.type.transaction.datasource.jdbc.mapping,提供支撑服务的包有annotation.binding.io.logging.plugin.reflection.scripting.exception.executor.parsing 二.从使用入手 MyBatis使用的三板斧是SqlSessionFac

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

* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAliases和typeHandlers等,本文的篇幅也主要在对这三个配置解析过程的分析上.下面,我们来一起看一下本篇文章的目录结构. 从目录上可以看出,2.3节.2.5节和2.8节的内容比较多.其中2.3节是关于settings配置解析过程的分析,除了对常规的 XML 解析过程分析,本节额外的分析了元

mybatis源码-解析配置文件(三)之配置文件Configuration解析(超详细, 值得收藏)

1. 简介 1.1 系列内容 本系列文章讲解的是mybatis解析配置文件内部的逻辑, 即 Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 其背后的逻辑. 1.2 适合对象 了解如何使用 mybatis 来访问数据库.可参看<

mybatis源码-解析配置文件(四)之配置文件Mapper解析

在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的一部分配置, 在本文章中, 我们讲解解析mappers节点, 即 xxxMapper.xml 文件的解析. 1 解析入口 在解析 mybatis-config.xml 时, 会进行解析 xxxMapper.xml 的文件. 在图示流程的 XMLConfigBuilder.parse() 函数中, 该

mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

相关文章推荐 mybatis 缓存的使用, 看这篇就够了 mybatis源码-解析配置文件(四)之配置文件Mapper解析 1. 简介 本文章主要讲解的是, xxxMapper.xml 文件中, cache 节点的源码. 2. 解析 XMLMapperBuilder.cacheElement() 方法主要负责解析 <cache> private void cacheElement(XNode context) throws Exception { if (context != null) {

mybatis专题(三)-----mybatis源码学习

源码分析概述 源码包分析 下载地址 MyBatis 源码下载地址:https://github.com/mybatis/mybatis-3 导入过程 1. 下载MyBatis的源码 2. 检查maven的版本,必须是3.25以上,建议使用maven的最新版本 3. mybatis的工程是maven工程,在开发工具中导入,工程必须使用jdk1.8以上版本: 4. 把mybatis源码的pom文件中true,全部改为false,或者直接删除这行: 5. 在工程目录下执行 mvn clean inst

【Spring源码分析】Bean加载流程概览

代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已,Spring的加载过程相对是不太透明的,不太好去找加载的代码入口. 下面有很简单的一段代码可以作为Spring代码加载的入口: 1 ApplicationContext ac = new Clas

Spring源码解析-applicationContext.xml加载和bean的注册

applicationContext文件加载和bean注册流程? Spring对于从事Java开发的boy来说,再熟悉不过了,对于我们这个牛逼的框架的介绍就不在这里复述了,Spring这个大杂烩,怎么去使用怎么去配置,各种百度谷歌都能查到很多大牛教程,但是,当我们按着教程一步步的把spring的开发框架搭建起来的时候,有没有一种想搞明白spring的冲动,万事开头难,就要从开头开始,而我认为spring开头就是如何加载配置文件,并初始化配置文件里面的bean当然也包括了我们用注解Service.