Spring placeholder默认值设置

本文介绍了Canal项目中如何使用Spring PlaceholderConfigurer扩展来为配置项设置默认值。通过具体的代码示例,展示了当配置文件中未指定某项配置时,系统如何采用预设的默认值。

看到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的
* {@linkplain org.springframework.beans.factory.config.PropertyPlaceholderConfigurer}
* ,增加默认值的功能。 例如:${placeholder:defaultValue},假如placeholder的值不存在,则默认取得
* defaultValue。
* @author jianghang 2013-1-24 下午03:37:56
* @version 1.0.0
* */
看一下类图

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

            this.placeholder = placeholder;
            this.defaultValue = defaultValue;
        }
    }



原文链接:https://www.jianshu.com/p/6f5a9a02b2d2

### 如何为日期时间组件设置默认值 为了实现日期选择器的默认值设定以及动态范围限制,在 React 和 Ant Design 中可以通过 `moment` 或者 `dayjs` 来处理日期对象,并利用受控组件的方式管理状态。下面是一个具体的例子来展示如何配置月份的选择逻辑并自动调整日期选择器的初始值。 #### 使用 Moment.js 的示例代码 ```javascript import React, { useState } from 'react'; import { DatePicker, Radio } from 'antd'; import moment from 'moment'; const App = () => { const [dateRange, setDateRange] = useState(['start', 'end']); function onChange(value) { let startDate; let endDate; switch (value) { case "thisMonth": startDate = moment().startOf('month'); endDate = moment(); break; default: startDate = null; endDate = null; } setDateRange([startDate, endDate]); } return ( <> <Radio.Group defaultValue="custom" onChange={(e) => onChange(e.target.value)}> <Radio.Button value="custom">自定义</Radio.Button> <Radio.Button value="thisMonth">本月</Radio.Button> </Radio.Group> <DatePicker.RangePicker showTime={{ format: 'HH:mm' }} format="YYYY-MM-DD HH:mm" placeholder={['开始时间', '结束时间']} disabledDate={disabledDate} value={[...dateRange]} onChange={(dates) => setDateRange(dates)} /> </> ); function disabledDate(current) { if (!current) return false; // 只能选当前月内的日期 return current && (current < moment().startOf('month') || current > moment()); } }; ``` 此段代码展示了当用户选择了不同的时间段选项时,如何更新日期选择器的状态以反映新的起始和终止日期[^1]。此外,还实现了对可选日期范围的有效控制,确保所选日期不会超出选定的时间区间之外。 对于 Spring Boot 后端服务而言,如果涉及到前后端交互中的默认属性设置,则可以考虑使用 `SpringApplication.setDefaultProperties()` 方法来自定义应用程序启动时的一些全局参数[^2];不过这与前端框架无关,主要用于服务器端环境变量或配置文件加载前的应用程序初始化阶段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值