xml中${}的使用含義(美元符號大括號,以Spring、ibatis、mybatis為例)


xml中${}的使用含義(美元符號大括號,以Spring、ibatis、mybatis為例)

 轉:
項目中,經常會在xml中看到這樣的寫法:
復制代碼
<properties resource="properties/database.properties"/>

<dataSource type="SIMPLE">
      <property value="${driver}" name="JDBC.Driver"/>
      <property value="${url}" name="JDBC.ConnectionURL"/>
      <property value="${username}" name="JDBC.Username"/>
      <property value="${password}" name="JDBC.Password"/>
    </dataSource>
復制代碼

看到了${}這樣的表達式,腦海里面第一印象是不是我們jsp中的EL表達式?!

哈哈。。。

不過,這個真不是EL表達式,Spring提供了自己的EL表達式,可是它的格式是#{}

so....

${key}這樣的表達式在XML中,代表引入的properties文件中key對應的一個變量值,完全是靠第三方jar自己解析的。

 

==============分割線===========

舉例:

a.ibatis的配置文件中,${}的解析,直接上代碼:

 

復制代碼
public static String parsePropertyTokens(String string, Properties variables) {
    final String OPEN = "${";
    final String CLOSE = "}";

    String newString = string;
    if (newString != null && variables != null) {
      int start = newString.indexOf(OPEN);
      int end = newString.indexOf(CLOSE);

      while (start > -1 && end > start) {
        String prepend = newString.substring(0, start);
        String append = newString.substring(end + CLOSE.length());
        String propName = newString.substring(start + OPEN.length(), end);
        String propValue = variables.getProperty(propName);
        if (propValue == null) {
          newString = prepend + propName + append;
        } else {
          newString = prepend + propValue + append;
        }
        start = newString.indexOf(OPEN);
        end = newString.indexOf(CLOSE);
      }
    }
    return newString;
  }
復制代碼

 

發現木有,完全就是解析字符的嘛!!!!代碼參考:com.ibatis.common.xml.NodeletUtils.java

b.spring的配置文件中,${}的解析,直接上代碼

復制代碼
/** 
     * Resolve placeholder values in the given array of patterns. 
     * @return a new array with updated patterns 
     */  
    protected String[] resolveEmbeddedValuesInPatterns(String[] patterns) {  
        if (this.embeddedValueResolver == null) {  
            return patterns;  
        }  
        else {  
            String[] resolvedPatterns = new String[patterns.length];  
            for (int i=0; i < patterns.length; i++) {  
                resolvedPatterns[i] = this.embeddedValueResolver.resolveStringValue(patterns[i]);  
            }  
            return resolvedPatterns;  
        }  
    }  
復制代碼

Spring的代碼是不是很晦澀,有興趣的童鞋研究PropertyPlaceholderConfigurer(而且如果它未找到${xxx}中定義的xxx鍵,它還會去JVM系統屬性(System.getProperty())和環境變量(System.getenv())中尋找)

 

總結:

xml文件中,如果使用了${},解析的工作依靠的就是第三方jar;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM