Spring注解——使用@Conditional來(lái)按照條件注冊(cè)bean

1.有時(shí)候需要根據(jù)不同條件生成不同的 bean侥涵,這時(shí)候就需要用到 @Conditional 注解。常見(jiàn)的一種用法,就是根據(jù)操作系統(tǒng)類(lèi)型暖途,注冊(cè)不同的 bean卑惜。在 BeanConfig 配置類(lèi)中增加三個(gè) bean。

package io.mieux.config;

import io.mieux.bean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {

    @Bean(value = "zhangsan")
    public Person getPerson() {
        return new Person("zhangsan", 28);
    }

    @Bean(value = "linux")
    public Person getLinux() {
        return new Person("linux", 50);
    }

    @Bean(value = "windows")
    public Person getWindows() {
        return new Person("windows", 30);
    }

    @Bean(value = "mac")
    public Person getMac() {
        return new Person("mac", 24);
    }
}

查看當(dāng)前容器中 Person 類(lèi)的實(shí)例有哪些:

package io.mieux;

import io.mieux.bean.Person;
import io.mieux.config.BeanConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App04 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
        String[] beanNames = annotationConfigApplicationContext.getBeanNamesForType(Person.class);
        for (String beanName : beanNames) {
            System.out.println("beanName: " + beanName);
        }
    }
}

運(yùn)行效果:

beanName: zhangsan
beanName: linux
beanName: windows
beanName: mac

2.使用 @Conditional 注解來(lái)根據(jù)操作系統(tǒng)的不同注冊(cè)不同的 bean丧肴。首先需要實(shí)現(xiàn) Condition 接口残揉,創(chuàng)建三個(gè) Condition 接口的實(shí)現(xiàn)類(lèi) LinuxConditon、MacConditon 和 WindowsConditon芋浮,獲取運(yùn)行環(huán)境的操作系統(tǒng)類(lèi)型進(jìn)行判斷抱环。

LinuxConditon:

package io.mieux.condition;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

// 判斷是否是 linux 系統(tǒng)
public class LinuxConditon implements Condition {

    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();

        String operatingSystem = environment.getProperty("os.name");
        if ("linux".equals(operatingSystem)) {
            System.out.println("Operating System: " + environment.getProperty("os.name"));
            return true;
        }
        return false;
    }
}

WindowsConditon:

package io.mieux.condition;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

// 判斷是否是 windows 系統(tǒng)
public class WindowsConditon implements Condition {

    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();

        String operatingSystem = environment.getProperty("os.name");
        if (operatingSystem.contains("Windows")) {
            System.out.println("Operating System: " + environment.getProperty("os.name"));
            return true;
        }
        return false;
    }
}

MacConditon:

package io.mieux.condition;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

// 判斷是否是 mac os 系統(tǒng)
public class MacConditon implements Condition {

    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();

        String operatingSystem = environment.getProperty("os.name");
        if ("Mac OS X".equals(operatingSystem)) {
            System.out.println("Operating System: " + environment.getProperty("os.name"));
            return true;
        }
        return false;
    }
}

在 BeanConfig 配置類(lèi)中加上 @Conditional 注解。

package io.mieux.config;

import io.mieux.bean.Person;
import io.mieux.condition.LinuxConditon;
import io.mieux.condition.MacConditon;
import io.mieux.condition.WindowsConditon;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {

    @Bean(value = "zhangsan")
    public Person getPerson() {
        return new Person("zhangsan", 28);
    }

    @Bean(value = "linux")
    @Conditional(value = {LinuxConditon.class})
    public Person getLinux() {
        return new Person("linux", 50);
    }

    @Bean(value = "windows")
    @Conditional(value = {WindowsConditon.class})
    public Person getWindows() {
        return new Person("windows", 30);
    }

    @Bean(value = "mac")
    @Conditional(value = {MacConditon.class})
    public Person getMac() {
        return new Person("mac", 24);
    }
}

運(yùn)行效果:

Operating System: Mac OS X
beanName: zhangsan
beanName: mac
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纸巷,一起剝皮案震驚了整個(gè)濱河市镇草,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘤旨,老刑警劉巖梯啤,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異存哲,居然都是意外死亡因宇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)祟偷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)察滑,“玉大人,你說(shuō)我怎么就攤上這事修肠『爻剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵嵌施,是天一觀的道長(zhǎng)饲化。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吗伤,這世上最難降的妖魔是什么吃靠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮足淆,結(jié)果婚禮上撩笆,老公的妹妹穿的比我還像新娘。我一直安慰自己缸浦,他們只是感情好夕冲,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著裂逐,像睡著了一般歹鱼。 火紅的嫁衣襯著肌膚如雪替劈。 梳的紋絲不亂的頭發(fā)上绿语,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天戈泼,我揣著相機(jī)與錄音睡陪,去河邊找鬼。 笑死庭敦,一個(gè)胖子當(dāng)著我的面吹牛疼进,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秧廉,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼伞广,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了疼电?” 一聲冷哼從身側(cè)響起嚼锄,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔽豺,沒(méi)想到半個(gè)月后区丑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡修陡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年沧侥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魄鸦。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宴杀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出号杏,到底是詐尸還是另有隱情婴氮,我是刑警寧澤斯棒,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布盾致,位于F島的核電站,受9級(jí)特大地震影響荣暮,放射性物質(zhì)發(fā)生泄漏庭惜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一穗酥、第九天 我趴在偏房一處隱蔽的房頂上張望护赊。 院中可真熱鬧,春花似錦砾跃、人聲如沸骏啰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)判耕。三九已至,卻和暖如春翘骂,著一層夾襖步出監(jiān)牢的瞬間壁熄,已是汗流浹背帚豪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留草丧,地道東北人狸臣。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像昌执,于是被迫代替她去往敵國(guó)和親烛亦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,859評(píng)論 6 342
  • 1.1 spring IoC容器和beans的簡(jiǎn)介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器仙蚜,...
    simoscode閱讀 6,721評(píng)論 2 22
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理此洲,服務(wù)發(fā)現(xiàn),斷路器委粉,智...
    卡卡羅2017閱讀 134,702評(píng)論 18 139
  • 文/落落 舒服的禮拜天,正坐在圖書(shū)館看書(shū)的我栗涂,忽然被手機(jī)嚇一跳知牌,一看、是我許久未聯(lián)系的一個(gè)朋友來(lái)電斤程,這時(shí)候的第一反...
    洛日余暉閱讀 253評(píng)論 0 0
  • 書(shū)法練習(xí)打卡第四十九天
    Chilli剁椒魚(yú)頭閱讀 194評(píng)論 0 1