天天看點

Spring placeholder預設值設定

看到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 設定預設值的一種擴充。
看一下類圖
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