项目中,经常会在xml中看到这样的写法:
看到了${}这样的表达式,脑海里面第一印象是不是我们jsp中的EL表达式?!
哈哈。。。
不过,这个真不是EL表达式,Spring提供了自己的EL表达式,可是它的格式是#{}
so....
${key}这样的表达式在XML中,代表引入的properties文件中key对应的一个变量值,完全是靠第三方jar自己解析的。
==============分割线===========
举例:
a.ibatis的配置文件中,${}的解析,直接上代码:
public staticString 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);
}
}returnnewString;
}
发现木有,完全就是解析字符的嘛!!!!代码参考:com.ibatis.common.xml.NodeletUtils.java
b.spring的配置文件中,${}的解析,直接上代码
/*** Resolve placeholder values in the given array of patterns.
*@returna new array with updated patterns*/
protectedString[] resolveEmbeddedValuesInPatterns(String[] patterns) {if (this.embeddedValueResolver == null) {returnpatterns;
}else{
String[] resolvedPatterns= newString[patterns.length];for (int i=0; i < patterns.length; i++) {
resolvedPatterns[i]= this.embeddedValueResolver.resolveStringValue(patterns[i]);
}returnresolvedPatterns;
}
}
Spring的代码是不是很晦涩,有兴趣的童鞋研究PropertyPlaceholderConfigurer(而且如果它未找到${xxx}中定义的xxx键,它还会去JVM系统属性(System.getProperty())和环境变量(System.getenv())中寻找)
总结:
xml文件中,如果使用了${},解析的工作依靠的就是第三方jar;