springboot @ConditionalOnMissingBean與@ConditionalOnBean用法

@ConditionalOnMissingBean與@ConditionalOnBean

倆個(gè)作用:根據(jù)當(dāng)前環(huán)境或者容器情況來(lái)動(dòng)態(tài)注入bean纳像,要配合@Bean使用
@ConditionalOnMissingBean作用:判斷當(dāng)前需要注入Spring容器中的bean的實(shí)現(xiàn)類(lèi)是否已經(jīng)含有婴栽,有的話不注入帆竹,沒(méi)有就注入
@ConditionalOnBean作用:判斷當(dāng)前需要注冊(cè)的bean的實(shí)現(xiàn)類(lèi)否被spring管理合砂,如果被管理則注入目胡,反之不注入

@ConditionalOnMissingBean锯七,它是修飾bean的一個(gè)注解,主要實(shí)現(xiàn)的是誉己,當(dāng)你的bean被注冊(cè)之后眉尸,如果而注冊(cè)相同類(lèi)型的bean,就不會(huì)成功巨双,它會(huì)保證你的bean只有一個(gè)噪猾,即你的實(shí)例只有一個(gè),當(dāng)你注冊(cè)多個(gè)相同的bean時(shí)筑累,會(huì)出現(xiàn)異常袱蜡,以此來(lái)告訴開(kāi)發(fā)人員。

@Component
public class AutoConfig {
  @Bean
  public AConfig aConfig() {
    return new AConfig("lind");
  }

  @Bean
  @ConditionalOnMissingBean(AMapper.class)
  public AMapper aMapper1(AConfig aConfig) {
    return new AMapperImpl1(aConfig);
  }

  @Bean
  public AMapper aMapper2(AConfig aConfig) {
    return new AMapperImpl2(aConfig);
  }
}

因?yàn)樵赼Mapper1上面標(biāo)識(shí)了AMapper類(lèi)型的bean只能有一個(gè)實(shí)現(xiàn) @ConditionalOnMissingBean(AMapper.class)疼阔,所以在進(jìn)行aMapper2注冊(cè)時(shí)戒劫,系統(tǒng)會(huì)出現(xiàn)上面圖上的異常半夷,這是正常的。

當(dāng)我們把 @ConditionalOnMissingBean(AMapper.class) 去掉之后迅细,你的bean可以注冊(cè)多次巫橄,這時(shí)需要用的@Primary來(lái)確定你要哪個(gè)實(shí)現(xiàn);一般來(lái)說(shuō)茵典,對(duì)于自定義的配置類(lèi)湘换,我們應(yīng)該加上@ConditionalOnMissingBean注解,以避免多個(gè)配置同時(shí)注入的風(fēng)險(xiǎn)统阿。

@Primary標(biāo)識(shí)哪個(gè)是默認(rèn)的bean

@Bean
  public AMapper aMapper1(AConfig aConfig) {
    return new AMapperImpl1(aConfig);
  }

  @Bean
  @Primary
  public AMapper aMapper2(AConfig aConfig) {
    return new AMapperImpl2(aConfig);
  }

另一個(gè)案例
程序入口:ConditionalDemoApplication:

@SpringBootApplication
public class ConditionalDemoApplication implements CommandLineRunner {
    @Autowired
    private Van van;

    public static void main(String[] args) {
        SpringApplication.run(ConditionalDemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception{
        van.fight();
    }
}

Van.java

@Service
public class Van {
    @Autowired
    private Fighter fighter;

    public void fight(){
        System.out.println("van:boy next door,do you like 玩游戲");
        fighter.fight();
    }
}

Fighter.java及其實(shí)現(xiàn)類(lèi):

public interface Fighter {
    void fight();
}
@Service
public class Babana implements Fighter {
    @Override
    public void fight(){
        System.out.println("Banana: 自由的氣息彩倚,蕉遲但到");
    }
}
@Service
public class Billy implements Fighter {
    public void fight(){
        System.out.println("Billy:吾乃新日暮里的王,三界哲學(xué)的主宰扶平。");

    }
}

VanConfig:

@Configuration
public class VanConfig {
    @Bean
    @ConditionalOnBean(Billy.class)
    public Fighter fighter(){
        return new Billy();
    }

    @Bean
    @ConditionalOnMissingBean
    public Fighter fighter2(){
        return new Babana();
    }
}

1帆离、運(yùn)行程序,輸入結(jié)果如下:
Billy:吾乃新日暮里的王结澄,三界哲學(xué)的主宰哥谷。

2、如果將Billy Bean的代碼注釋掉:

@Configuration
public class VanConfig {
    /*@Bean
    @ConditionalOnBean(Billy.class)
    public Fighter fighter(){
        return new Billy();
    }*/

    @Bean
    @ConditionalOnMissingBean
    public Fighter fighter2(){
        return new Babana();
    }
}

重新運(yùn)行麻献,輸入結(jié)果如下:
Banana: 自由的氣息们妥,蕉遲但到

3、或者勉吻,我們將Billy上的@Service注解注釋掉监婶,讓springboot掃描不到該類(lèi):

//@Service
public class Billy implements Fighter {
    public void fight(){
        System.out.println("Billy:吾乃新日暮里的王,三界哲學(xué)的主宰齿桃。");

    }
}
同時(shí)恢復(fù)VanConfig里的配置:
@Configuration
public class VanConfig {
    @Bean
    @ConditionalOnBean(Billy.class)
    public Fighter fighter(){
        return new Billy();
    }

    @Bean
    @ConditionalOnMissingBean
    public Fighter fighter2(){
        return new Babana();
    }
}
再次運(yùn)行惑惶,輸入結(jié)果如下(與第2次試驗(yàn)的效果相同):

場(chǎng)景實(shí)例:
Service 層,通過(guò)@ConditionalOnProperty 判斷,然后結(jié)合@ConditionalOnMissingBean(xx.class) 做只能生效一個(gè)service

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市源譬,隨后出現(xiàn)的幾起案子集惋,更是在濱河造成了極大的恐慌孕似,老刑警劉巖踩娘,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喉祭,居然都是意外死亡养渴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)泛烙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)理卑,“玉大人,你說(shuō)我怎么就攤上這事蔽氨∶赀耄” “怎么了帆疟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宇立。 經(jīng)常有香客問(wèn)我踪宠,道長(zhǎng),這世上最難降的妖魔是什么妈嘹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任柳琢,我火速辦了婚禮,結(jié)果婚禮上润脸,老公的妹妹穿的比我還像新娘柬脸。我一直安慰自己,他們只是感情好毙驯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布倒堕。 她就那樣靜靜地躺著,像睡著了一般爆价。 火紅的嫁衣襯著肌膚如雪涩馆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天允坚,我揣著相機(jī)與錄音魂那,去河邊找鬼。 笑死稠项,一個(gè)胖子當(dāng)著我的面吹牛涯雅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播展运,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼活逆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了拗胜?” 一聲冷哼從身側(cè)響起蔗候,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎埂软,沒(méi)想到半個(gè)月后锈遥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勘畔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年所灸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炫七。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爬立,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出万哪,到底是詐尸還是另有隱情侠驯,我是刑警寧澤抡秆,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站吟策,受9級(jí)特大地震影響琅轧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踊挠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一乍桂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧效床,春花似錦睹酌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至沪猴,卻和暖如春辐啄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背运嗜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工壶辜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人担租。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓砸民,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親奋救。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岭参,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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