<properties>
標籤讀取#propertiesElement(XNode context)
方法,解析 <properties />
節點。大致邏輯以下:java
解析 <properties />
標籤,成Properties對象。覆蓋configuration中的 Properties 對象到上面的結果。設置結果到 parser 和configuration 中。代碼以下: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
所以,經過方法參數傳遞的屬性具備最高優先級,resource/url 屬性中指定的配置文件次之,最低優先級的是 properties 屬性中指定的屬性。mybatis
失控的阿甘,樂於分享,記錄點滴ui