@Conditional條件化Bean裝配

@Conditional 能解決什么問題

可以使Bean在滿足一定的條件Condition下才進(jìn)行裝配欺缘。

條件Condition如何定義挤安?

實(shí)現(xiàn)Condition接口,重寫matches()方法络凿。
返回true則條件成立,否則不成立絮记。
代碼如下:

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

public class ACondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
   //doSomething
    }
}

可以看到matches方法提供了兩個(gè)參數(shù)怨愤,是接口類型:
ConditionContextAnnotatedTypeMetadata

ConditionContext接口

public interface ConditionContext {

    BeanDefinitionRegistry getRegistry();

    ConfigurableListableBeanFactory getBeanFactory();

    Environment getEnvironment();

    ResourceLoader getResourceLoader();

    ClassLoader getClassLoader();

} 

通過ConditionContext,我們可以做到如下幾點(diǎn):

方法 作用
getRegistry() 借助返回的BeanDefinitionRegistry檢查bean的定義
getBeanFactory() 借助返回的ConfigrableListableBeanFactory檢查是否存在篮愉,甚至檢查bean的屬性
getEnvironment() 借助返回Environment檢查環(huán)境變量是否存在以及讀取它的值是什么
getResourceLoader() 讀取并檢查它返回的ResourceLoader所加載的資源
getClassLoader() 借助它的返回的ClassLoader加載并檢查類是否存在

AnnotatedTypeMetadata接口

public interface AnnotatedTypeMetadata {

    boolean isAnnotated(String annotationType);

    Map<String, Object> getAnnotationAttributes(String annotationType);

    Map<String, Object> getAnnotationAttributes(String annotationType, boolean classValuesAsString);

    MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationType);

    MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationType, boolean classValuesAsString);

}

AnnotatedTypeMetadataisAnnotated()方法差导,能夠判斷帶有@Bean注解的方法是否有別的注解。其他的方法颠蕴,能夠獲取@Bean注解的方法上其他注解的屬性助析。

@Conditional 如何使用

直接上代碼:

@Service
@Conditional(ACondition.class)
@AConditionAnno
public class AConditionServiceImpl implements ConditionService{
    @Override
    public String getName() {
        return this.getClass().getName();
    }
}

用法為:@Conditional(Condition.class)
加上之后,SpringAConditionServiceImpl會(huì)根據(jù)AConditionmatches()方法的返回值來決定能否注冊(cè)該Bean寡键。

Demo

1.定義條件Condition

public class ACondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        for (String name:conditionContext.getRegistry().getBeanDefinitionNames()
             ) {
            System.out.println(name);
        }
        System.out.println(conditionContext.getBeanFactory().containsBean("BeforeAConditionBean")
                +"/"+annotatedTypeMetadata.isAnnotated(AConditionAnno.class.getName()));
        return 
            annotatedTypeMetadata.isAnnotated(AConditionAnno.class.getName());
    }
}

上面的代碼中:

  1. 通過ConditionContext打印當(dāng)前所有已經(jīng)注冊(cè)的BeanID雪隧。
  2. 判斷BeanID為BeforeAConditionBean的Bean是否已經(jīng)創(chuàng)建膀跌。
  3. 判斷需要?jiǎng)?chuàng)建的Bean是否帶有AConditionAnno注解。

2.為Bean加上條件注解@Conditional

@Service
@Conditional(ACondition.class)
@AConditionAnno
public class AConditionServiceImpl implements ConditionService{
    @Override
    public String getName() {
        return this.getClass().getName();
    }
}

3.測(cè)試類主方法

@RunWith(SpringRunner.class)
@SpringBootTest
public class ConditionalTest {

    @Autowired
    ConditionService conditionService;

    @Test
    public void test(){
        System.out.println(conditionService.getName());
    }

}

不出意外劫流,@Autowired是可以裝配成功的丛忆。
如果把AConditionServiceImpl類上的@AConditionAnno注解去掉,那么測(cè)試類報(bào)錯(cuò)熄诡,@Autowired找不到Bean。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末我抠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓣窄,更是在濱河造成了極大的恐慌纳鼎,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劝贸,死亡現(xiàn)場(chǎng)離奇詭異逗宁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疙剑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門言缤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來禁灼,“玉大人,你說我怎么就攤上這事弄捕。” “怎么了穿铆?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵斋荞,是天一觀的道長。 經(jīng)常有香客問我凤优,道長蜈彼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任棍辕,我火速辦了婚禮,結(jié)果婚禮上楚昭,老公的妹妹穿的比我還像新娘。我一直安慰自己栋荸,他們只是感情好凭舶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匆背,像睡著了一般身冀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搂根,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天剩愧,我揣著相機(jī)與錄音,去河邊找鬼仁卷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芒帕,可吹牛的內(nèi)容都是我干的丰介。 我是一名探鬼主播背蟆,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼淆储,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼家浇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钢悲,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎还棱,沒想到半個(gè)月后珍手,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體办铡,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寡具,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年稚补,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厦坛。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乍惊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亩歹,到底是詐尸還是另有隱情凡橱,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布稼钩,位于F島的核電站达罗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巡李。R本人自食惡果不足惜扶认,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狱从。 院中可真熱鬧,春花似錦季研、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至款慨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桩了,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工埠戳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颗圣。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓屁使,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔽午。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 1.1 spring IoC容器和beans的簡介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器,...
    simoscode閱讀 6,719評(píng)論 2 22
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理骄恶,服務(wù)發(fā)現(xiàn)匕垫,斷路器,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • 第三章 高級(jí)裝配 標(biāo)簽(空格分隔): 未分類 [TOC] 環(huán)境與profile 配置profile bean 在開...
    施瓦閱讀 390評(píng)論 0 0
  • 如今悔捶,已是二十出頭的已婚青年,人生經(jīng)歷了二十多年的時(shí)光犁柜,總有許多記憶猶新的事情,還有一些模糊不清的片段馋缅。 ...
    千樺y閱讀 147評(píng)論 0 0
  • 在這個(gè)所有人都喊著要提升自己皆的,要追求成功的時(shí)代,很流行的一句話是——我要改變硝全,我要成為更好的自己。當(dāng)所有的雞湯都在...
    一鹿長清閱讀 275評(píng)論 4 10