Spring Boot自定義DatePropertySrouce資源池

有的時候,我們會希望在配置文件中直接配置基于時間的參數(shù),例如租副,當服務向注冊中心注冊的時候我們希望帶上服務啟動的時間戳。

如下较性,Spring Boot的配置文件中可以很方便的配置隨機數(shù)用僧。

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}

同樣,我們期望的時間配置方式如下:

spring.cloud.consul.discovery.tags=now=${date.now},timestamp=${date.timestamp}

如何實現(xiàn)不多說赞咙,上代碼责循。

核心實現(xiàn):DatePropertySource

繼承PropertySource,實現(xiàn)特定的Date資源池攀操。
支持Calendar中所有屬性的單獨獲取院仿,方便自由組合,使用方式:${date.PROP_NAME}

public class DatePropertySource extends PropertySource<Calendar> {

    private static final Log log = LogFactory.getLog(DatePropertySource.class);

    public static final String DATE_PROPERTY_SOURCE_NAME = "date_time";

    public static final String PREFIX = "date.";

    public static final String NOW = "NOW";
    public static final String TIMESTAMP = "TIMESTAMP";
    //yyyy-MM-dd HH:mm:ss
    public static final String FORMAT = "FORMAT";
    public static final String YMD = "YMD";
    public static final String HMS = "HMS";
    public static final String ERA = "ERA";
    public static final String YEAR = "YEAR";
    public static final String DAY_OF_YEAR = "DAY_OF_YEAR";
    public static final String DAY_OF_MONTH = "DAY_OF_MONTH";
    public static final String WEEK_OF_YEAR = "WEEK_OF_YEAR";
    public static final String WEEK_OF_MONTH = "WEEK_OF_MONTH";
    public static final String DAY_OF_WEEK_IN_MONTH = "DAY_OF_WEEK_IN_MONTH";
    public static final String AM_PM = "AM_PM";
    public static final String HOUR = "HOUR";
    public static final String HOUR_OF_DAY = "HOUR_OF_DAY";
    public static final String MINUTE = "MINUTE";
    public static final String SECOND = "SECOND";
    public static final String MILLISECOND = "MILLISECOND";

    public DatePropertySource(String name) {
        super(name, Calendar.getInstance());
    }
    public DatePropertySource() {
        this(DATE_PROPERTY_SOURCE_NAME);
    }
    @Override
    public Object getProperty(String name) {
        if (!name.startsWith(PREFIX)) {
            return null;
        }
        if (log.isTraceEnabled()) {
            log.trace("Generating date property for '" + name + "'");
        }
        String valueType = name.substring(PREFIX.length()).toUpperCase();
        Calendar now = Calendar.getInstance();
        switch (valueType) {
            case NOW:
                return getNow(now);
            case TIMESTAMP:
                return getTimestamp(now);
            case FORMAT:
                return getFormat(now);
            case YMD:
                return getYMD(now);
            case HMS:
                return getHMS(now);
            case ERA:
                return getEra(now);
            case YEAR:
                return getYear(now);
            case DAY_OF_YEAR:
                return getDayOfYear(now);
            case DAY_OF_MONTH:
                return getDayOfMonth(now);
            case WEEK_OF_YEAR:
                return getWeekOfYear(now);
            case WEEK_OF_MONTH:
                return getWeekOfMonth(now);
            case DAY_OF_WEEK_IN_MONTH:
                return getDayOfWeekInMonth(now);
            case AM_PM:
                return getAmOrPm(now);
            case HOUR:
                return getHour(now);
            case HOUR_OF_DAY:
                return getHourOfDay(now);
            case MINUTE:
                return getMinute(now);
            case SECOND:
                return getSecond(now);
            case MILLISECOND:
                return getMilliSecond(now);
            default:
                return getNow(now);
        }
    }

    public static void addToEnvironment(ConfigurableEnvironment environment) {
        environment.getPropertySources().addAfter(
                StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
                new RandomValuePropertySource(DATE_PROPERTY_SOURCE_NAME));
        log.trace("RandomValuePropertySource add to Environment");
    }
    private Date getNow(Calendar instance) {
        return instance.getTime();
    }
    private String getFormat(Calendar instance) {
        StringBuffer sb = new StringBuffer(64);
        sb.append(instance.get(Calendar.YEAR))
                .append("-")
                .append(instance.get(Calendar.MONTH))
                .append("-")
                .append(instance.get(Calendar.DAY_OF_MONTH))
                .append(" ")
                .append(instance.get(Calendar.HOUR))
                .append(":")
                .append(instance.get(Calendar.MINUTE))
                .append(":")
                .append(instance.get(Calendar.SECOND));
        return sb.toString();
    }
    private long getTimestamp(Calendar instance) {
        return instance.getTimeInMillis();
    }
    private String getYMD(Calendar instance) {
        return instance.get(Calendar.YEAR) + "-" + instance.get(Calendar.MONTH) + "-" + instance.get(Calendar.DAY_OF_MONTH);
    }
    private String getHMS(Calendar instance) {
        return instance.get(Calendar.HOUR_OF_DAY) + ":" + instance.get(Calendar.MINUTE) + ":" + instance.get(Calendar.SECOND);
    }

    private int getEra(Calendar instance) {
        return instance.get(Calendar.ERA);
    }
    private int getYear(Calendar instance) {
        return instance.get(Calendar.YEAR);
    }
    private int getDayOfYear(Calendar instance) {
        return instance.get(Calendar.DAY_OF_YEAR);
    }
    private int getDayOfMonth(Calendar instance) {
        return instance.get(Calendar.DAY_OF_MONTH);
    }
    private int getWeekOfYear(Calendar instance) {
        return instance.get(Calendar.WEEK_OF_YEAR);
    }
    private int getWeekOfMonth(Calendar instance) {
        return instance.get(Calendar.WEEK_OF_MONTH);
    }
    private int getDayOfWeek(Calendar instance) {
        return instance.get(Calendar.DAY_OF_WEEK);
    }
    private int getDayOfWeekInMonth(Calendar instance) {
        return instance.get(Calendar.DAY_OF_WEEK_IN_MONTH);
    }
    private int getAmOrPm(Calendar instance) {
        return instance.get(Calendar.AM_PM);
    }
    private int getHour(Calendar instance) {
        return instance.get(Calendar.HOUR);
    }
    private int getHourOfDay(Calendar instance) {
        return instance.get(Calendar.HOUR_OF_DAY);
    }
    private int getMinute(Calendar instance) {
        return instance.get(Calendar.MINUTE);
    }
    private int getSecond(Calendar instance) {
        return instance.get(Calendar.SECOND);
    }
    private int getMilliSecond(Calendar instance) {
        return instance.get(Calendar.MILLISECOND);
    }
}

加入系統(tǒng)資源池

實現(xiàn)ApplicationContextInitializer接口速和,將DatePropertySource加入系統(tǒng)資源池歹垫,使其生效。

public class DatePropertyConfiguration implements ApplicationContextInitializer{

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        DatePropertySource datePropertySource = new DatePropertySource();
        environment.getPropertySources().addLast(datePropertySource);
    }
}

resources\META-INF\spring.factories中配置ApplicationContextInitializer颠放,SpringBoot啟動時會自動加載排惨。

org.springframework.context.ApplicationContextInitializer=\
com.example.demo.config.DatePropertyConfiguration

完成

OK,至此碰凶,一個自定義的資源池就完成了暮芭,從此配置文件中可以自由組合,直接配置時間的不同格式了欲低。
注意:使用的時間在屬性值生成完成后固定辕宏,不會在每次使用、注入的時候改變伸头。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末匾效,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恤磷,更是在濱河造成了極大的恐慌面哼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扫步,死亡現(xiàn)場離奇詭異魔策,居然都是意外死亡,警方通過查閱死者的電腦和手機河胎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門闯袒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事政敢∑溽悖” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵喷户,是天一觀的道長唾那。 經(jīng)常有香客問我,道長褪尝,這世上最難降的妖魔是什么闹获? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮河哑,結果婚禮上避诽,老公的妹妹穿的比我還像新娘。我一直安慰自己璃谨,他們只是感情好沙庐,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睬罗,像睡著了一般轨功。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上容达,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音垂券,去河邊找鬼花盐。 笑死,一個胖子當著我的面吹牛菇爪,可吹牛的內容都是我干的算芯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凳宙,長吁一口氣:“原來是場噩夢啊……” “哼熙揍!你這毒婦竟也來了?” 一聲冷哼從身側響起氏涩,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤届囚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后是尖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體意系,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年饺汹,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛔添。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迎瞧,靈堂內的尸體忽然破棺而出夸溶,到底是詐尸還是另有隱情,我是刑警寧澤凶硅,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布缝裁,位于F島的核電站,受9級特大地震影響咏尝,放射性物質發(fā)生泄漏压语。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一编检、第九天 我趴在偏房一處隱蔽的房頂上張望胎食。 院中可真熱鬧,春花似錦允懂、人聲如沸厕怜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粥航。三九已至,卻和暖如春生百,著一層夾襖步出監(jiān)牢的瞬間递雀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工蚀浆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缀程,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓市俊,卻偏偏與公主長得像杨凑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子摆昧,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容