Spring-Boot autoconfigure之Condition

本文主要介紹spring和springboot提供的幾個annotation和interface實現(xiàn)符合幾種既定條件或自定義條件下的autoconfigure


一畏浆、spring實現(xiàn)自定義條件下的autoconfigure

spring為我們提供了@ConditionalCondition.class搭配使用的方式實現(xiàn)自定義條件下的autoconfigure悄蕾,源碼如下:

Condition.png

@Conditional.png

編寫一個class姆涩,繼承Condition這個接口息裸,重寫matches()方法顶滩,當該方法返回true時auto-configure生效铃诬,反之不生效贿肩,代碼如下

public class MyCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {

        //what.is.you.name的value寫在application.properties中
        String name = conditionContext.getEnvironment().getProperty("what.is.you.name");
        return "bamu".equals(name);
    }
}

matches方法提供了ConditionContextAnnotatedTypeMetadata兩個參數(shù),我們可以通過ConditionContext獲取到編寫在application-xxx.properties中的配置信息聂使。

application.properties配置文件內容如下:注意我們現(xiàn)在定義的value和Mycondition中定義的不同

what.is.you.name=heiheihei

編寫一個Config類壁拉,其中runnableBean1拐叉、runnableBean3需要滿足我們以上自定義的條件才允許被自動注入。

@SpringBootConfiguration
public class ConditionBeanConfig {

    @Bean
    @Conditional(MyCondition.class)
    public Runnable runnableBean1() {
        return () ->{};
    }

    @Bean
    public Runnable runnableBean2() {
        return () ->{};
    }

    @Bean
    @Conditional(MyCondition.class)
    public Runnable runnableBean3() {
        return () ->{};
    }
}

執(zhí)行main方法結果如下:

@SpringBootApplication
public class BlogApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext context = SpringApplication.run(BlogApplication.class, args);
        String[] beans = context.getBeanNamesForType(Runnable.class);
        System.out.println(Arrays.toString(beans));

        context.close();
    }
}

heiheihei.png

修改application.properties扇商,將value改為MyCondition.class中定義的值后執(zhí)行結果如下:

bamu.png

我們發(fā)現(xiàn)凤瘦,自定義的MyCondition已經生效。細心的讀者可能發(fā)現(xiàn)案铺,@Conditional注解源碼中傳入的value是一個數(shù)組Class<? extends Condition>[] value();蔬芥,所以我們可以傳入多個自定義Condition,例如@Condition({MyCondition.class, YourCondition.class})

另外控汉,@Conditianal不僅可以寫在方法上笔诵,還可以寫在configuration.class上,這樣該類中的所有bean都需要滿足自定義的Condition才能被自動加載姑子。

二乎婿、spring-boot提供的幾個autoconfigure annotation

springboot為我們提供了一批實用的XxxCondition,查看了他們的源碼后發(fā)現(xiàn)街佑,他們都實現(xiàn)了spring提供的Condition接口谢翎,然后編寫對應的annotation。我們在使用他們的時候沐旨,只需要在需要的地方寫上這些annotation就好了森逮。這些注解都在springboot提供的jar包中
package org.springframework.boot.autoconfigure.condition

springboot提供的Condition注解.png

通過這幾個annotation的命名,我們已經能夠大概的猜測到他們能夠實現(xiàn)哪些功能磁携。以下舉出其中幾個比較常用的注解用法褒侧,讀者可以查看源碼,知曉具體的使用方式谊迄。

1)@ConditionalOnBean/@ConditionalOnMissingBean當容器中存在/不存在某個bean時闷供,加上此注解的bean被自動注入

@ConditionalOnBean
    @Bean
    @ConditionalOnBean(name="com.springboot.condition.User")
    public Runnable runnableBean2() {
        return () ->{};
    }

    @Bean
    @ConditionalOnBean(value=User.class)
    public Runnable runnableBean2() {
        return () ->{};
    }

2)@ConditionalOnJava根據(jù)當前使用的JDK版本,判斷是否自動注入

    //使用jdk8才注入此bean
    @Bean
    @ConditionalOnJava(ConditionalOnJava.JavaVersion.EIGHT)
    public Runnable runnableBean2() {
        return () ->{};
    }

3)@ConditionalOnWebApplication/@ConditionalOnWebApplicationweb環(huán)境下加載/不加載此bean

    @Bean
    @ConditionalOnWebApplication
    public Runnable runnableBean2() {
        return () ->{};
    }

好了统诺,Spring-Boot autoconfigure之Condition就到這里歪脏,有興趣的讀者可以自己去試驗一下。接下來會持續(xù)推出一系列Java干貨篙议,敬請期待唾糯。如果有不正確或是不完整的地方怠硼,還望讀者不吝賜教鬼贱,直接評論!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末香璃,一起剝皮案震驚了整個濱河市这难,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葡秒,老刑警劉巖姻乓,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嵌溢,死亡現(xiàn)場離奇詭異,居然都是意外死亡蹋岩,警方通過查閱死者的電腦和手機赖草,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剪个,“玉大人秧骑,你說我怎么就攤上這事】勰遥” “怎么了乎折?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侵歇。 經常有香客問我骂澄,道長,這世上最難降的妖魔是什么惕虑? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任坟冲,我火速辦了婚禮,結果婚禮上溃蔫,老公的妹妹穿的比我還像新娘樱衷。我一直安慰自己,他們只是感情好酒唉,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布矩桂。 她就那樣靜靜地躺著,像睡著了一般痪伦。 火紅的嫁衣襯著肌膚如雪侄榴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天网沾,我揣著相機與錄音癞蚕,去河邊找鬼。 笑死辉哥,一個胖子當著我的面吹牛桦山,可吹牛的內容都是我干的。 我是一名探鬼主播醋旦,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼恒水,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饲齐?” 一聲冷哼從身側響起钉凌,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捂人,沒想到半個月后御雕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矢沿,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年酸纲,在試婚紗的時候發(fā)現(xiàn)自己被綠了捣鲸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡闽坡,死狀恐怖摄狱,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情无午,我是刑警寧澤媒役,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站宪迟,受9級特大地震影響酣衷,放射性物質發(fā)生泄漏。R本人自食惡果不足惜次泽,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一穿仪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧意荤,春花似錦啊片、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捐寥,卻和暖如春笤昨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背握恳。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工瞒窒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乡洼。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓崇裁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親束昵。 傳聞我的和親對象是個殘疾皇子拔稳,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容