长治卫校贴吧:mybatis源码配置文件剖析之一:剖析properties标签

admin/2020-04-14/ 分类:科技/阅读:

mybatis作为一样平常开发的常用ORM框架,在开发中起着很主要的作用,领会其源码对一样平常的开发有很大的辅助。源码版本为:3-3.4.x,可执行到github举行下载。

从这篇文章最先逐一剖析mybatis的焦点设置文件(mybatis-config.xml),今天先来看properties标签的剖析历程。

一、概述

在单独使用mybatis的时刻,mybatis的焦点设置文件(mybatis-config.xml)就显的稀奇主要,是整个mybatis运行的基础,只有把设置文件中的各个标签准确剖析后才可以准确使用mybatis,下面看properties标签的设置,properties标签的作用就是加载properties文件或者property标签,下面看其详细设置,实例如下

<properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </properties>

上面是设置的properties标签的设置,在标签中设置了resource属性和property子标签。下面看详细的剖析流程,这里剖析properties标签的剖析历程,启动流程暂不说,直接看剖析的代码。

二、详述

上面,看到了properties标签的设置,下面看其剖析方式,这里只粘贴部门代码,下面是parseConfiguration方式的代码,

private void parseConfiguration(XNode root) { try { //issue #117 read properties first //剖析properties标签  propertiesElement(root.evalNode("properties")); //剖析settings标签 Properties settings = settingsAsProperties(root.evalNode("settings")); loadCustomVfs(settings); //剖析别名标签,例<typeAlias alias="user" type="cn.com.bean.User"/> typeAliasesElement(root.evalNode("typeAliases")); //剖析插件标签 pluginElement(root.evalNode("plugins")); //剖析objectFactory标签,此标签的作用是mybatis每次建立效果工具的新实例时都市使用ObjectFactory,若是不设置 //则默认使用DefaultObjectFactory来建立,设置之后使用设置的 objectFactoryElement(root.evalNode("objectFactory")); //剖析objectWrapperFactory标签 objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); //剖析reflectorFactory标签 reflectorFactoryElement(root.evalNode("reflectorFactory")); settingsElement(settings); // read it after objectFactory and objectWrapperFactory issue #631 //剖析environments标签 environmentsElement(root.evalNode("environments")); databaseIdProviderElement(root.evalNode("databaseIdProvider")); typeHandlerElement(root.evalNode("typeHandlers")); //剖析<mappers>标签 mapperElement(root.evalNode("mappers")); } catch (Exception e) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: "  e, e); } }

从上面的代码中可以找到下面的代码,即为剖析的代码,

propertiesElement(root.evalNode("properties"));

这个方式就是剖析properties标签,下面看详细的剖析历程。

1、剖析子标签和属性

/** * 剖析mybatis-config.xml文件中的properties标签 *<properties resource="org/mybatis/example/config.properties"> *<property name="username" value="dev_user"/> *<property name="password" value="F2Fa3!33TYyg"/> *</properties> *剖析步骤: *1、剖析设置的property标签,放到defaults中; *2、剖析resource或url属性,放到defaults中; *3、获取configuration中的variables变量值,放到defaults中 * @param context * @throws Exception */ private void propertiesElement(XNode context) throws Exception { if (context != null) { //1、读取properties标签中的property标签<property name="" value=""/> Properties defaults = context.getChildrenAsProperties(); //2、读取properties标签中的resource、url属性 String resource = context.getStringAttribute("resource"); String url = context.getStringAttribute("url"); //resource和url属性不能同时泛起在properties标签中 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不为空,则剖析为properties,放到defaults中,由于defaults是key-value结构,以是会笼罩相同key的值 if (resource != null) { defaults.putAll(Resources.getResourceAsProperties(resource)); } else if (url != null) {//若是url不为空,则剖析为properties,放到defaults中,由于defaults是key-value结构,以是会笼罩相同key的值  defaults.putAll(Resources.getUrlAsProperties(url)); } //3、获得configuration中的variables变量的值,此变量可以通过SqlSessionFactoryBuilder.build()传入properties属性值 Properties vars = configuration.getVariables(); //若是挪用build的时刻传入了properties属性,放到defaults中 if (vars != null) { defaults.putAll(vars); } //放到parser和configuration工具中  parser.setVariables(defaults); configuration.setVariables(defaults); } }

从上面的剖析历程可以看到,首先剖析properties标签的子标签,也就是property标签,通过下面的方式获得,

//1、读取properties标签中的property标签<property name="" value=""/> Properties defaults = context.getChildrenAsProperties();

剖析property标签,并放到Properties工具中。那么是若何防盗Properties工具中的那,在getChildrenAsProperties方式中,

public Properties getChildrenAsProperties() { Properties properties = new Properties(); for (XNode child : getChildren()) { String name = child.getStringAttribute("name"); String value = child.getStringAttribute("value"); if (name != null && value != null) { properties.setProperty(name, value); } } return properties; }

可以看出是循环property标签,获得其name和value属性,并放入properties工具中。

接着剖析properties的resource和url属性,如下

//2、读取properties标签中的resource、url属性 String resource = context.getStringAttribute("resource"); String url = context.getStringAttribute("url");

划分获得resource和url属性,这里这两个属性都是一个路径。

2、处置属性

下面看这个判断,

//resource和url属性不能同时泛起在properties标签中 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."); }

这个判断解释在properties标签中,resource和url属性不能同时泛起。

2.1、处置resource和url属性

下面看resource和url属性的处置,这里resource和url两个属性都是代表的一个路径,以是这里肯定是需要读取响应路径下的文件。

//若是resource不为空,则剖析为properties,放到defaults中,由于defaults是key-value结构,以是会笼罩相同key的值 if (resource != null) { defaults.putAll(Resources.getResourceAsProperties(resource)); } else if (url != null) {//若是url不为空,则剖析为properties,放到defaults中,由于defaults是key-value结构,以是会笼罩相同key的值  defaults.putAll(Resources.getUrlAsProperties(url)); }

下面看对resource的处置,挪用的Resources.getResourceAsProperties(resource))方式,对resource举行处置,

public static Properties getResourceAsProperties(String resource) throws IOException { Properties props = new Properties(); InputStream in = getResourceAsStream(resource); props.load(in); in.close(); return props; }

从上面的代码可以看出是要转化为InputStream,最后放到Properties工具中,这里加载文件的详细历程,后面再详细剖析。

下面看对url的处置,挪用Resources.getUrlAsProperties(url)方式,对url举行处置,

public static Properties getUrlAsProperties(String urlString) throws IOException { Properties props = new Properties(); InputStream in = getUrlAsStream(urlString); props.load(in); in.close(); return props; }

上面的代码依然是把url代表的文件处置成Properties工具。

2.3、处置已添加的Properties

在上面处置完property子标签、resource和url属性后,还举行了下面的处置,即从configuration中获得properties,

//3、获得configuration中的variables变量的值,此变量可以通过SqlSessionFactoryBuilder.build()传入properties属性值 Properties vars = configuration.getVariables(); //若是挪用build的时刻传入了properties属性,放到defaults中 if (vars != null) { defaults.putAll(vars); }

若是configuration中已经存在properties信息,则取出来,放到defaults中。

2.4、放入configuration工具中

经由上面的处置,最后把所有的properties信息放到configuration中,

//放到parser和configuration工具中  parser.setVariables(defaults); configuration.setVariables(defaults);

把defaults放到了configuration的variables属性中,代表的是整个mybatis环境中所有的properties信息。这个信息可以在mybatis的设置文件中使用${key}使用,好比,${username},则会从configuration的variables中寻找key为username的属性值,并完成自动属性值替换。

三、总结

上面剖析了properties标签的剖析历程,先剖析property标签,然后是resource、url属性,最后是天生SqlSessionFactory的使用挪用SqlSessionFactoryBuilder的build方式,传入的properties,从上面的剖析历程,可以知道若是存在重复的键,那么最先剖析的会被后面剖析的笼罩掉,也就是剖析历程是:property子标签-->resource-->url-->开发者设置的,那么笼罩历程为:开发者设置的-->url-->resource-->property子标签,优先级最高的为开发者自己设置的properties属性。

 

原创不易,有不正之处迎接指正。

,

Sunbet

Sunbet申博 www.sunbet88.us是Sunbet指定的Sunbet官网,Sunbet提供Sunbet(Sunbet)、Sunbet、申博代理合作等业务。

TAG:
阅读:
广告 330*360
广告 330*360
Sunbet_进入申博sunbet官网
微信二维码扫一扫
关注微信公众号
新闻自媒体 Copyright © 2002-2019 Sunbet 版权所有
二维码
意见反馈 二维码