Spring placeholder默認(rèn)值設(shè)置

看到canal源碼的時(shí)候發(fā)現(xiàn)了好多這樣的寫法

<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的時(shí)候帶了:后面跟了一個(gè)值 后來才發(fā)現(xiàn)這是對(duì)spring placeholder 設(shè)置默認(rèn)值的一種擴(kuò)展。

/**
* 擴(kuò)展Spring的
* {@linkplain org.springframework.beans.factory.config.PropertyPlaceholderConfigurer}
* ,增加默認(rèn)值的功能。 例如:${placeholder:defaultValue},假如placeholder的值不存在,則默認(rèn)取得
* defaultValue。
* @author jianghang 2013-1-24 下午03:37:56
* @version 1.0.0
* */
看一下類圖

PropertyPlaceholderConfigurer類圖

這里只要實(shí)現(xiàn)了InitializingBean的afterPropertiesSet方法 和 ResourceLoaderAware 的setResourceLoader方法將資源的路徑解析出來,然后加載資源 。重寫了 PropertyPlaceholderConfigurer 的resolvePlaceholder 方法,先解析成DefaultablePlaceholder,然后發(fā)現(xiàn)取不到一個(gè)屬性的時(shí)候?qū)⒛J(rèn)值賦給該屬性,其中默認(rèn)值是冒號(hào)后面的值。DefaultablePlaceholder 是新定義的內(nèi)部類。
貼出主要實(shí)現(xiàn)的代碼

@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 >= 0) {
                defaultValue = trimToEmpty(placeholder.substring(commaIndex + 1));
                placeholder = trimToEmpty(placeholder.substring(0, commaIndex));
            }

            this.placeholder = placeholder;
            this.defaultValue = defaultValue;
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,275評(píng)論 6 342
  • application的配置屬性。 這些屬性是否生效取決于對(duì)應(yīng)的組件是否聲明為Spring應(yīng)用程序上下文里的Bea...
    新簽名閱讀 5,540評(píng)論 1 27
  • 這些屬性是否生效取決于對(duì)應(yīng)的組件是否聲明為 Spring 應(yīng)用程序上下文里的 Bean(基本是自動(dòng)配置的),為一個(gè)...
    發(fā)光的魚閱讀 1,489評(píng)論 0 14
  • 你不會(huì)孤獨(dú)的活著,我也不會(huì)。我們的生活里上演著各種劇情,有溫情的,有悲情的,有撼動(dòng)人心的感動(dòng),也有心涼瀕死的...
    了然未了閱讀 466評(píng)論 0 0

友情鏈接更多精彩內(nèi)容