在项目中经常看到这样的${}标识方法,如:
<!-- dataSource 配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" lazy-init="true" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--数据库加密-->
<property name="passwordCallback" ref="dbPasswordCallback"/>
<property name="connectionProperties" value="password=${jdbc.password}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${ds.initialSize}"/>
<property name="minIdle" value="${ds.minIdle}"/>
<property name="maxActive" value="${ds.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${ds.maxWait}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${ds.timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${ds.minEvictableIdleTimeMillis}"/>
</bean>
看到了${}这样的表达式,脑海里面第一印象我们jsp中的EL表达式,
不过,这个并不是EL表达式,Spring提供了自己的EL表达式,可是它的格式是 #{},
${key}这样的表达式在XML中,代表引入的properties文件中key对应的一个变量值,完全是靠第三方jar自己解析的。如:
在ibatis中${key}的解析(代码参考:com.ibatis.common.xml.NodeletUtils.java)如下:
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;
}
在spring中${key}的解析如下:
/**
* 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;
}
}
转载自 https://my.oschina.net/u/574036/blog/789867