日拱一卒,功不唐捐。
在了解 @Conditional 之前先花 10 秒鐘復(fù)習(xí)一下 @Configuration 這個(gè)注解。
@Configuration 是干什么?
是配合 @Bean 注解來配置 Spring 容器的 bean 的。
那它為什么會(huì)出現(xiàn)呢?
因?yàn)榕渲?bean 的另一種方式是 xml ,狗都不用。
那給個(gè)示例看看唄?
簡單。
@Configuration
public?class?AppConfig?{
????@Bean
????public?MyBean?myBean()?{
????????//?初始化,?配置,?返回bean...
????}
}
下面進(jìn)入主題:
@Conditional 是什么東西?
首先明確第一點(diǎn):
@Conditional 是?Spring?提供的。
其次明確第二點(diǎn):
Conditional 中文譯為:有條件的,依...而定的。
前邊既然講了 @Configuration 的簡單用法,那么問題就是:
@Configuration + @Conditional 有沒有搞頭?
有搞頭。
怎么搞?
那就是可以給@Configuration加上一個(gè)開關(guān)。
我打開開關(guān),你這配置就好用。
我關(guān)閉開關(guān),你這配置就不好用。
進(jìn)一步升級。
我給 @Configuration 里的 @Bean 加一個(gè)開關(guān)。
我打開開關(guān),你這 bean 就注冊。
我關(guān)閉開關(guān),你這 bean 就不注冊。
那開關(guān)在哪里呢?
廢話不多說,先上代碼。
@Configuration
@Conditional(MyCondition.class)
public?class?ConditionConfig?{
????@Bean
????public?ConditionBean?conditionBean()?{
????????return?new?ConditionBean();
????}
}
開關(guān)就是代碼中的?MyCondition.class。
WTF is MyCondition.class ?
MyCondition類就是我們自定義的開關(guān),我們定義什么時(shí)候開,什么時(shí)候關(guān)的邏輯。
很明顯這個(gè)邏輯不可能是 Spring 給的。
但 Spring 又必須插手管理。
通過什么呢?
沒錯(cuò),通過接口 Condition。
這個(gè)接口中什么都沒有,只有一個(gè)?matches?方法,返回一個(gè) boolean 值。
顯而易見,你返回 true, 開關(guān)打開,返回 false,開關(guān)關(guān)閉。
MyCondition 類代碼如下:
public?class?MyCondition?implements?Condition?{
????@Override
????public?boolean?matches(ConditionContext?context,?AnnotatedTypeMetadata?metadata)?{
????????return?true;
????}
}
可以看到 matches 方法中的兩個(gè)參數(shù),可以簡單介紹一下。
ConditionContext context?這個(gè)參數(shù)提供了一種方法來訪問關(guān)于Spring容器的信息。
AnnotatedTypeMetadata metadata?這個(gè)參數(shù)提供了對被注解類的元數(shù)據(jù)的訪問。
基于這兩個(gè)參數(shù)我們就可以創(chuàng)建復(fù)雜和動(dòng)態(tài)的條件來控制開關(guān)的閉合。
例如,你可以基于環(huán)境變量、定義的bean、類的存在等因素,來決定是否創(chuàng)建某個(gè)bean。
除了自定義 Condition,Springboot 還為我們擴(kuò)展了一些常用的 Condition。文章來源:http://www.zghlxwxcb.cn/news/detail-777076.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-777076.html
到了這里,關(guān)于@Conditional+@Configuration有沒有搞頭?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!