2.4.解析 settings 子元素 获取 Mybatis 系统设置

优质
小牛编辑
122浏览
2023-12-01

解析settings元素

点击查看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子节点必须有namevalue两个属性,而且在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的解析工作就完成了。