解析settings子元素,获取mybatis系统设置
解析settings元素
在完成对properties元素的解析工作之后,我们会发现源码的解析工作远没有我们想象的那么复杂。
相反只要思路是清晰的,那么整个解析工作还是比较简单的,怀着对学习的热情,我们继续解析settings元素。
// 将settings标签内的内容转换为Properties,并进行校验。
Properties settings = settingsAsProperties(root.evalNode("settings"));
settings元素在mybatis的配置文件中起到的作用是配置mybatis的系统属性,这些系统属性控制着mybatis运行期间的各种行为。
他的DTD定义如下:
<!ELEMENT settings (setting+)>
<!ELEMENT setting EMPTY>
<!ATTLIST setting
name CDATA #REQUIRED
value CDATA #REQUIRED
>
在DTD定义中规定了在settings节点下必须有一个或者多个setting子节点,setting子节点必须有name和value两个属性,而且在setting下不能继续有其他子节点。
从这个定义上不难看出,settings元素的定义和properties元素差不多,因此settings节点理论上也可以被转换为Properties对象。
我们回到代码上来,看看settings元素实际上是如何解析的:
/**
* 解析settings节点
*
* @param context settings节点
*/
private Properties settingsAsProperties(XNode context) {
if (context == null) {
// 如果没有配置settings节点,返回个空配置
return new Properties();
}
// 将`setting`节点转换为Properties对象
Properties props = context.getChildrenAsProperties();
// 获取Configuration类的描述对象
MetaClass metaConfig = MetaClass.forClass(Configuration.class, localReflectorFactory);
// 检查Settings节点下的配置是否被支持
for (Object key : props.keySet()) {
if (!metaConfig.hasSetter(String.valueOf(key))) {
// 校验 setting 配置的属性是否支持
throw new BuilderException("The setting " + key + " is not known. Make sure you spelled it correctly (case sensitive).");
}
}
return props;
}
整体来说,解析settings元素做的事情比较少,就简单的先获取所有的setting子节点,把他转换成Properties对象。
之后简单的校验一下用户通过setting子节点配置的属性名称在Configuration对象中是否有对应的setter方法定义,然后返回获取到的Properties对象。
可以在
settings中配置的属性参见:mybatis官方文档:设置
就这样,settings的解析工作就完成了。