Mybatis技術內幕:初始化之標籤

<properties> 標籤讀取

#propertiesElement(XNode context) 方法,解析 <properties /> 節點。大致邏輯以下:java

解析 <properties />標籤,成Properties對象。覆蓋configuration中的 Properties 對象到上面的結果。設置結果到 parserconfiguration 中。代碼以下:apache

//xxxx.properties
prop1=bbbb

//mybatis-config
<properties resource="org/apache/ibatis/builder/jdbc.properties">
    <property name="prop1" value="aaaa"/>
</properties>

Properties props = new Properties();
props.put("prop1", "cccc");
XMLConfigBuilder builder = new XMLConfigBuilder(inputStream, null, props);
複製代碼
// XMLConfigBuilder.java

private void propertiesElement(XNode context) throws Exception {
    if (context != null) {
        // 讀取子標籤們,爲 Properties 對象
        Properties defaults = context.getChildrenAsProperties();
        // 讀取 resource 和 url 屬性
        String resource = context.getStringAttribute("resource");
        String url = context.getStringAttribute("url");
        if (resource != null && url != null) { // resource 和 url 都存在的狀況下,拋出 BuilderException 異常
            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 配置文件到 defaults 中。
        if (resource != null) {
            defaults.putAll(Resources.getResourceAsProperties(resource));
            // 讀取遠程 Properties 配置文件到 defaults 中。
        } else if (url != null) {
            defaults.putAll(Resources.getUrlAsProperties(url));
        }
        // 讀取 configuration 中的 Properties 對象到 defaults 中。
        Properties vars = configuration.getVariables();
        if (vars != null) {
            defaults.putAll(vars);
        }
        // 設置 defaults 到 parser 和 configuration 中。
        parser.setVariables(defaults);
        configuration.setVariables(defaults);
    }
}
複製代碼

若是屬性在不僅一個地方進行了配置,那麼 MyBatis 將按照下面的順序來加載:bash

  • properties 元素體內指定的屬性首先被讀取。
  • 而後根據 properties元素中的resource屬性讀取類路徑下屬性文件或根據 url 屬性指定的路徑讀取屬性文件,並覆蓋已讀取的同名屬性。
  • 最後讀取做爲方法參數傳遞的屬性,並覆蓋已讀取的同名屬性。

所以,經過方法參數傳遞的屬性具備最高優先級,resource/url 屬性中指定的配置文件次之,最低優先級的是 properties 屬性中指定的屬性。mybatis

失控的阿甘,樂於分享,記錄點滴ui

相關文章
相關標籤/搜索