看到canal源碼的時候發現了好多這樣的寫法
<bean id="eventParser" class="com.alibaba.otter.canal.parse.inbound.mysql.MysqlEventParser">
<property name="destination" value="${canal.instance.destination}" />
<property name="slaveId" value="${canal.instance.mysql.slaveId:1234}" />
<!-- 心跳配置 -->
<property name="detectingEnable" value="${canal.instance.detecting.enable:false}" />
<property name="detectingSQL" value="${canal.instance.detecting.sql}" />
<property name="detectingIntervalInSeconds" value="${canal.instance.detecting.interval.time:5}" />
<property name="haController">
<bean class="com.alibaba.otter.canal.parse.ha.HeartBeatHAController">
<property name="detectingRetryTimes" value="${canal.instance.detecting.retry.threshold:3}" />
<property name="switchEnable" value="${canal.instance.detecting.heartbeatHaEnable:false}" />
</bean>
</property>
property的屬性${canal.instance.mysql.slaveId:1234} 取配置檔案key的時候帶了:後面跟了一個值 後來才發現這是對spring placeholder 設定預設值的一種擴充。
看一下類圖
PropertyPlaceholderConfigurer類圖
這裡隻要實作了InitializingBean的afterPropertiesSet方法 和 ResourceLoaderAware 的setResourceLoader方法将資源的路徑解析出來,然後加載資源 。重寫了 PropertyPlaceholderConfigurer 的resolvePlaceholder 方法,先解析成DefaultablePlaceholder,然後發現取不到一個屬性的時候将預設值賦給該屬性,其中預設值是冒号後面的值。DefaultablePlaceholder 是新定義的内部類。
貼出主要實作的代碼
@Override
protected String resolvePlaceholder(String placeholder, Properties props, int systemPropertiesMode) {
DefaultablePlaceholder dp = new DefaultablePlaceholder(placeholder);
String value = super.resolvePlaceholder(dp.placeholder, props, systemPropertiesMode);
if (value == null) {
value = dp.defaultValue;
}
return trimToEmpty(value);
}
private static class DefaultablePlaceholder {
private final String defaultValue;
private final String placeholder;
public DefaultablePlaceholder(String placeholder){
int commaIndex = placeholder.indexOf(":");
String defaultValue = null;
if (commaIndex >= ) {
defaultValue = trimToEmpty(placeholder.substring(commaIndex + ));
placeholder = trimToEmpty(placeholder.substring(, commaIndex));
}
this.placeholder = placeholder;
this.defaultValue = defaultValue;
}
}
原文連結:https://www.jianshu.com/p/6f5a9a02b2d2