2.4.解析 settings 子元素 获取 Mybatis 系统设置
优质
小牛编辑
135浏览
2023-12-01
解析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
的解析工作就完成了。