SpringBoot基礎教程(十八)——自定義條件注解

spring boot 擴展了spring 的@Conditional注解呜袁,提供了很多常用的注解韩肝,例如@ConditionalOnProperty根據(jù)屬性來判斷是否要激活這個配置文件或者是激活這個Bean陪每,@ConditionalOnBean根據(jù)容器中是否有這個Bean來判斷逻澳,
@ConditionalOnClass根據(jù)項目路徑中是否有某個Class來判斷垒在,等等吧蒜魄,但是官方提供的有時不能完全滿足我們的需求,就需要我們自己來進行擴展场躯。例如我們設想一個場景:不同的環(huán)境不同的配置谈为,有個配置我們希望只在開發(fā)環(huán)境與測試環(huán)境存在,生產(chǎn)環(huán)境不存在踢关,硬編碼太low了伞鲫,我們可以試用下spring提供的Conditional,通過描述签舞,是根據(jù)描述環(huán)境的屬性來判斷這個Bean是否創(chuàng)建秕脓,可以聯(lián)想到是@ConditionalOnProperty,但是這個注解有個havingValue只接受一個值儒搭,不能接受兩個值(dev和test),這個時候我們就需要擴展這個注解吠架。下面我們開始吧,pom相對于上一節(jié)沒啥特別的變化搂鲫,就不說了傍药,我們就從代碼開始。

首先聲明一個注解

package com.shuqi.anno;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.shuqi.MyOnPropertyCondition;
import org.springframework.context.annotation.Conditional;
import org.springframework.core.env.Environment;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional(MyOnPropertyCondition.class)
public @interface MyConditionalOnProperty {

    
    String value();

    
    String prefix() default "";

    
    String[] name() default {};

    
    String havingValue() default "";

   
    boolean matchIfMissing() default false;

    
    boolean relaxedNames() default true;


    //TODO ADD ONE PROPERTY
    String[] havingValues() default {};

}

沒啥太多的不同魂仍,只不過多了一個屬性havingValues是一個字符串數(shù)組類型的拐辽。下面我們看下,通過這個注解引入的Condition的判斷邏輯類MyOnPropertyCondition

package com.shuqi;

import com.shuqi.anno.MyConditionalOnProperty;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.util.Map;


/**
 * @author olifer
 */
public class MyOnPropertyCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(MyConditionalOnProperty.class.getName());
        String propertyName = (String) annotationAttributes.get("value");
        String[] values = (String[]) annotationAttributes.get("havingValues");
        String propertyValue = context.getEnvironment().getProperty(propertyName);
        for (String havingValue : values) {
            if (propertyValue.equalsIgnoreCase(havingValue)) {
                return true;
            }
        }
        return false;
    }
}

里面的邏輯也很簡單擦酌,從注解中拿到value和havingValues的值俱诸,將value的內(nèi)容作為key從環(huán)境中獲取到對應的value與havingValues中的內(nèi)容進行對比,如果匹配上仑氛,返回true乙埃,那么標示這個條件通過闸英。看下我們的配置文件中的內(nèi)容

env: test

最后看下我們的配置類中的使用方式:

package com.shuqi;

import com.shuqi.anno.MyConditionalOnProperty;
import com.shuqi.model.Person;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author linyang on 18/5/1.
 */
@Slf4j
@Configuration
public class MyConfig {

    @Bean
    @MyConditionalOnProperty(value = "env",havingValues = {"dev","test"})
    public Person person(){
        log.info("創(chuàng)建Bean");
        return new Person();
    }
}

表達的含義是介袜,獲取env這個屬性的值與test和dev進行判斷甫何,如果包含的話,這個名字叫做person的Bean就會創(chuàng)建遇伞,否則不會創(chuàng)建辙喂。

今天就說到這里,大家可以拉取源碼看看效果鸠珠。

本節(jié)項目源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巍耗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子渐排,更是在濱河造成了極大的恐慌炬太,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驯耻,死亡現(xiàn)場離奇詭異亲族,居然都是意外死亡,警方通過查閱死者的電腦和手機可缚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門霎迫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帘靡,你說我怎么就攤上這事知给。” “怎么了描姚?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵涩赢,是天一觀的道長。 經(jīng)常有香客問我轰胁,道長谒主,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任赃阀,我火速辦了婚禮霎肯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘榛斯。我一直安慰自己观游,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布驮俗。 她就那樣靜靜地躺著懂缕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪王凑。 梳的紋絲不亂的頭發(fā)上搪柑,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天聋丝,我揣著相機與錄音,去河邊找鬼工碾。 笑死弱睦,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的渊额。 我是一名探鬼主播况木,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旬迹!你這毒婦竟也來了火惊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤奔垦,失蹤者是張志新(化名)和其女友劉穎屹耐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宴倍,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡张症,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸵贬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡脖捻,死狀恐怖阔逼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情地沮,我是刑警寧澤嗜浮,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站摩疑,受9級特大地震影響危融,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雷袋,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一吉殃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧楷怒,春花似錦蛋勺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刃泡,卻和暖如春巧娱,著一層夾襖步出監(jiān)牢的瞬間碉怔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工禁添, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撮胧,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓上荡,卻偏偏與公主長得像趴樱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子酪捡,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理叁征,服務發(fā)現(xiàn),斷路器逛薇,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 本來是準備看一看Spring源碼的捺疼。然后在知乎上看到來一個帖子,說有一群**自己連Spring官方文檔都沒有完全讀...
    此魚不得水閱讀 6,926評論 4 21
  • 一一 宣恩愛寶貝教育托輔中心一一 寒假將至永罚,很多父母會帶孩子回老家或者外出游玩啤呼,車站、游樂場呢袱、商場官扣、馬路等地方人流...
    龍紅閱讀 378評論 1 0
  • 沒有孤獨 只有孤獨的指令 行與不行 死或是生 只在指尖輕輕一擰 居于大城 穿行者 有如魅魂 伏身低眉 全是臣服的自...
    平天下之文世界閱讀 136評論 0 1