【Mybatis 源码】 Mybatis 是如何解析配置文件中的内容 -- properties
创始人
2024-03-15 02:10:18
0

Mybatis 是如何解析配置文件中的内容 – properties

文章目录

  • Mybatis 是如何解析配置文件中的内容 -- properties
  • 一、加载入口
    • 1. XMLConfigBuilder
  • 二、解析 properties 节点
    • 1. 使用方式
    • 2. 解析节点
  • 三、参考链接


一、加载入口

如果我们使用 Spring 集成 Mybatis 使用的话,可以在 Spring 的配置文件,比如 applicationContext.xml 或者其他自定义的配置文件中找到下面这一段配置。

      

可以从上面了解到使用了 SqlSessionFactoryBean 作为 Spring 加载配置文件的主入口,并且将 dataSource 和 configLocation 两个属性值注入到 SqlSessionFactoryBean,并且等待 Spring 启动的时候将注册过的 SqlSessionFactoryBean 加载。当然这边并不准备细讲 SqlSessionFactoryBean,而是主要对 Mybatis 做详细了解。

在 SqlSessionFactoryBean 可以找到 xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), null, this.configurationProperties); 这一行代码,这行代码则是加载 mybatis-config.xml 真正的过程,也就是说 XMLConfigBuilder 是专门负责 mybatis-config.xml 加载的一个类。再往下找则可以找到 XMLConfigBuilder 对配置进行解析的部分,下面代码中 xmlConfigBuilder.parse(); 则是 XMLConfigBuilder 真正开始解析的位置,并且可以在其中找到 parseConfiguration() 这一个方法。

if (xmlConfigBuilder != null) {  try {  xmlConfigBuilder.parse();  LOGGER.debug(() -> "Parsed configuration file: '" + this.configLocation + "'");  } catch (Exception ex) {  throw new NestedIOException("Failed to parse config resource: " + this.configLocation, ex);  } finally {  ErrorContext.instance().reset();  }  
}

1. XMLConfigBuilder

XMLConfigBuilder 主要通过 XMLConfigBuilder#parseConfiguration() 实现配置文件的解析过程,如果有对 Mybatis 的配置文件详细解读过一遍,就可以知道,下面代码中就是将 xml 配置文件的各个节点进行解析一遍。为了方便查阅,下面贴出原始的 Mybatis 配置文件中可以选择的配置项,当然如果是 Spring 集成了 Mybatis,则可以在相对应的标签中找到下面的选项。

  • 原始的 Mybatis 配置文件可配置项:
- configuration(根节点)- properties(属性)- settings(设置)- typeAliases(类型别名)- typeHandlers(类型处理器)- objectFactory(对象工厂)- plugins(插件)- environments(环境配置)- environment(子节点)- transactionManager(事务管理器)- dataSource(数据源)- databaseIdProvider(数据库厂商标识)- mappers(映射器)
  • XMLConfigBuilder#parseConfiguration():
private void parseConfiguration(XNode root) {try {// 解析 properties 节点propertiesElement(root.evalNode("properties"));// 解析 settings 节点Properties settings = settingsAsProperties(root.evalNode("settings"));loadCustomVfs(settings);loadCustomLogImpl(settings);// 解析 typeAliases 节点typeAliasesElement(root.evalNode("typeAliases"));// 解析 plugins 节点pluginElement(root.evalNode("plugins"));// 解析 objectFactory 节点objectFactoryElement(root.evalNode("objectFactory"));// 解析 objectWrapperFactory 节点objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));// 解析 reflectorFactory 节点reflectorFactoryElement(root.evalNode("reflectorFactory"));settingsElement(settings);// 解析 environments 节点environmentsElement(root.evalNode("environments"));// 解析 databaseIdProvider 节点databaseIdProviderElement(root.evalNode("databaseIdProvider"));// 解析 typeHandlers 节点typeHandlerElement(root.evalNode("typeHandlers"));// 解析 mappers 节点mapperElement(root.evalNode("mappers"));} catch (Exception e) {throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);}
}

二、解析 properties 节点

节点其实就是对配置文件中需要重复使用的一些变量提取并且通过设置键值对的方式来让其他配置方便调取使用,而不需要再各个配置中重复配置使用,这样既方便了使用,也方便了修改。

因为 节点中有多个属性,有 resource 和 url,而且这两个属性还不能同时使用,同时使用的时候会报错。

1. 使用方式

使用方式参考链接:【Mybatis 使用】mybatis-config.xml 配置(properties 和 settings)

properties 使用方式和其他配置文件差不多,下面先是设置了 username 和 password 两个属性,然后在具体使用的时候,使用 ${key} 的方式来获取,当然如果在另一个地方有一个专门的属性配置文件,则可以在 节点中加 resource 属性,来将这些另外的属性加入到其中。

      
        

2. 解析节点

private void propertiesElement(XNode context) throws Exception {// 传入的 properties 节点if (context != null) {// 获取 properties 节点的内容Properties defaults = context.getChildrenAsProperties();// 获取 resource 和 url 两个属性String resource = context.getStringAttribute("resource");String url = context.getStringAttribute("url");// resource 和 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.");}// 如果填写了 resource 属性,则会解析 resourceif (resource != null) {defaults.putAll(Resources.getResourceAsProperties(resource));} else if (url != null) {// 如果填写了 url 属性,则会解析 urldefaults.putAll(Resources.getUrlAsProperties(url));}// 获取 properties 中配置的键值对Properties vars = configuration.getVariables();if (vars != null) {defaults.putAll(vars);}// 将配置的属性放入到解析器和全局 configuration 中parser.setVariables(defaults);configuration.setVariables(defaults);}
}

三、参考链接

  • 属性(properties)

相关内容

热门资讯

以色列加密交易平台eToro美...   以色列股票和加密货币交易平台eToro集团周二表示,计划在美国进行规模更大的首次公开募股(IPO...
两位家居业“大佬”先后被调查留...   继居然智家董事长汪林朋之后,又一家居龙头企业创始人被留置。  5月13日晚间,A股上市公司美凯龙...
重磅数据公布!特朗普再怼鲍威尔...   当地时间5月13日,美股三大指数收盘涨跌不一。纳指上涨301.74点,涨幅1.61%;标普500...
第九届上海合作组织成员国教育部...   新华社乌鲁木齐5月13日电(记者贾钊、张瑜)第九届上海合作组织成员国教育部长会议13日在新疆乌鲁...
安徽新增两处国家林木种质资源库   记者从省林业局获悉,近日,国家林业和草原局公布第四批国家林木种质资源库,我省铜陵市国有林场泡桐国...
众安在线前4个月原保险保费收入... .ct_hqimg {margin: 10px 0;} .hqimg_wrapper {text-a...
分析师:英伟达或将很快取代苹果...   英伟达周二上涨5.6%后,其市值现已回升至3.1万亿美元以上。该公司股价目前已较4月份低点上涨3...
在传统与当代的经纬间“织锦” 图为昂桑的作品《藏女与花》。 图为昂桑的作品《十二生肖》。 图/文 本报记者 格桑伦珠 在拉萨...
完善知识产权制度 促进人工智能... 转自:千龙网今年全国知识产权宣传周的主题是“知识产权与人工智能”‌,涉及知识产权与人工智能技术相互支...
美国佛蒙特州暂停电动汽车销售要...   美国佛蒙特州州长菲尔·斯科特(Phil Scott)周二暂停了该州对乘用车、中型和重型卡车的电动...
浙江宣传:“预制式”调研不是真... 转自:北京日报客户端说起“预制菜”,想必很多人都不陌生。“预制菜”有着一样的配方、一样的味道,好处是...
俄乌代表团将同日抵达土耳其,泽... 俄乌会谈双方代表团将于5月15日抵达土耳其。乌克兰总统泽连斯基强调,他已准备在土耳其与俄罗斯总统普京...
发扬党的优良传统 恪尽职守努... 本报拉萨5月13日讯(记者 刘文涛 张黎黎 张尚华)5月12日,自治区党委书记王君正在拉萨与新任职干...
一季度日赚1亿多,京东集团CE... 转自:财联社《科创板日报》5月14日讯(记者 徐赐豪)进入外卖市场后,京东备受瞩目的一季报新鲜出炉。...
银河证券:看好AI+重铸电子行... 人民财讯5月14日电,银河证券研报指出,梳理电子行业一季度,认为AI基础设施建设所带动的相关硬件如A...
“读懂中国式现代化与现代化成果...   本报北京5月13日电  (记者张晓东)近日,中国科学院中国现代化研究中心联合人民出版社、北京大学...
石榴花开香喷喷 山歌唱响苗乡乐   “万紫千红大地春,石榴花开香喷喷。山歌唱响苗乡乐,清亲飞歌庆太平……”春耕时节的湖南省城步苗族自...
代表委员关注这件事|王绍南代表... 本报讯(记者吴贻伙)“农村基层治理不仅仅是乡村振兴的重要内容,更是国家治理体系的重要组成部分。”近日...
我省优化完善部分货车通行费优惠... 转自:新华日报近日,省交通运输厅、省发展改革委、省财政厅联合印发《关于优化完善我省部分货车车辆通行费...
国内核聚变项目建设加速 机构称... 媒体报道,日本政府近日宣布,将参与为设计耐用性较高且安全的核聚变反应堆、正在欧洲推进的建材试验计划。...