Spring注解之@Conditional使用解析
@Conditional
@Conditional注解可以說是SpringBoot的條件注解,表示組件只有在所有指定條件都匹配時才有資格注冊,條件是可以在 bean 定義注冊之前??以編程方式確定的任何狀態(tài)。
@Conditional注解可以通過以下任何方式使用:
- 作為直接或間接使用@Component注解的任何類的類型級注釋,包括@Configuration類
- 作為元注解,用于編寫自定義構(gòu)造型注釋
- 作為任何@Bean方法的方法級注解
如果@Configuration類被標(biāo)記為@Conditional ,那么與該類關(guān)聯(lián)的所有@Bean方法、 @Import 注解和@ComponentScan注解都將受制于條件。
SpringBoot @ConditionalOn*
SpringBoot提供的@ConditionalOn*的注解都是基于@Conditional注解實現(xiàn)
@ConditionalOnBean
僅當(dāng)滿足所有指定要求的 bean 已包含在BeanFactory中時才匹配的Conditional 。
必須滿足所有要求才能匹配條件,但不必由同一個 bean 滿足。
@ConditionalOnClass
僅當(dāng)指定的類在類路徑上時才匹配的Conditional 。
可以在@Configuration類上安全地指定value() ,因為在加載類之前使用 ASM 解析注釋元數(shù)據(jù)。
放置在@Bean方法上時需要格外小心,考慮將條件隔離在單獨的Configuration類中,特別是如果方法的返回類型與value()中的值匹配。
@ConditionalOnCloudPlatform
當(dāng)指定的云平臺處于活動狀態(tài)時匹配的Conditional。
@ConditionalOnExpression
取決于 SpEL 表達(dá)式的值的條件元素的配置注解。
@ConditionalOnJava
根據(jù)運行應(yīng)用程序的 JVM 版本匹配的Conditional。
@ConditionalOnJndi
基于 JNDI InitialContext的可用性和查找特定位置的能力匹配的Conditional。
@ConditionalOnMissingBean
僅當(dāng)BeanFactory中已不包含滿足指定要求的 bean 時才匹配的Conditional 。 條件匹配不必滿足任何要求,并且同一bean不必滿足這些要求。
@ConditionalOnMissingClass
僅當(dāng)指定的類不在類路徑上時才匹配的Conditional。
@ConditionalOnNotWebApplication
僅在應(yīng)用程序上下文不是 Web 應(yīng)用程序上下文時匹配的Conditional。
@ConditionalOnProperty
檢查指定屬性是否具有特定值的Conditional 。 默認(rèn)情況下,屬性必須存在于Environment中并且不等于false 。 havingValue()和matchIfMissing()屬性允許進(jìn)一步自定義。havingValue屬性可用于指定屬性應(yīng)具有的值。如果該屬性根本不包含在Environment中,則matchIfMissing()屬性。 默認(rèn)情況下,缺少的屬性不匹配。
@ConditionalOnResource
僅當(dāng)指定資源在類路徑上時才匹配的Conditional 。
@ConditionalOnSingleCandidate
僅當(dāng)指定類的 bean 已包含在BeanFactory中并且可以確定單個候選者時才匹配的Conditional 。 如果BeanFactory中已包含多個匹配的 bean 實例但已定義主要候選者,則條件也將匹配; 本質(zhì)上,如果自動裝配具有定義類型的 bean,則條件匹配將成功。 該條件只能匹配到目前為止已由應(yīng)用程序上下文處理的 bean 定義,因此,強烈建議僅在自動配置類上使用此條件。 如果候選 bean 可能由另一個自動配置創(chuàng)建,請確保使用此條件的 bean 在之后運行。
@ConditionalOnWebApplication
當(dāng)應(yīng)用程序是 Web 應(yīng)用程序時匹配的Conditional 。 默認(rèn)情況下,任何 Web 應(yīng)用程序都會匹配,但可以使用type()屬性縮小范圍。
@ConditionalOn*實現(xiàn)原理
以@ConditionalOnBean為例
@Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented @Conditional(OnBeanCondition.class) public @interface ConditionalOnBean{ //... }
@Conditional作為元注解,OnBeanCondition繼承SpringBootCondition,SpringBootCondition
實現(xiàn)自org.springframework.context.annotation.Condition。
public abstract class SpringBootCondition implements Condition { private final Log logger = LogFactory.getLog(getClass()); @Override public final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { String classOrMethodName = getClassOrMethodName(metadata); try { ConditionOutcome outcome = getMatchOutcome(context, metadata); logOutcome(classOrMethodName, outcome); recordEvaluation(context, classOrMethodName, outcome); return outcome.isMatch(); } catch (NoClassDefFoundError ex) { } } } //org.springframework.boot.autoconfigure.condition.OnBeanCondition @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { ConditionMessage matchMessage = ConditionMessage.empty(); if (metadata.isAnnotated(ConditionalOnBean.class.getName())) { BeanSearchSpec spec = new BeanSearchSpec(context, metadata, ConditionalOnBean.class); MatchResult matchResult = getMatchingBeans(context, spec); if (!matchResult.isAllMatched()) { String reason = createOnBeanNoMatchReason(matchResult); return ConditionOutcome.noMatch(ConditionMessage .forCondition(ConditionalOnBean.class, spec).because(reason)); } matchMessage = matchMessage.andCondition(ConditionalOnBean.class, spec) .found("bean", "beans") .items(Style.QUOTE, matchResult.getNamesOfAllMatches()); } //... return ConditionOutcome.match(matchMessage); }
到此這篇關(guān)于Spring注解之@Conditional使用解析的文章就介紹到這了,更多相關(guān)@Conditional使用解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Intellij IDEA實現(xiàn)springboot熱部署過程解析
這篇文章主要介紹了Intellij IDEA實現(xiàn)springboot熱部署過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08springboot?log4j2日志框架整合與使用過程解析
這篇文章主要介紹了springboot?log4j2日志框架整合與使用,包括引入maven依賴和添加配置文件log4j2-spring.xml的相關(guān)知識,需要的朋友可以參考下2022-05-05Java對數(shù)組實現(xiàn)選擇排序算法的實例詳解
這篇文章主要介紹了Java對數(shù)組實現(xiàn)選擇排序算法的實例,選擇排序的比較次數(shù)為 O(N^2)而交換數(shù)為O(N),需要的朋友可以參考下2016-04-04Spring Security組件一鍵接入驗證碼登錄和小程序登錄的詳細(xì)過程
這篇文章主要介紹了Spring Security 一鍵接入驗證碼登錄和小程序登錄,簡單介紹一下這個插件包的相關(guān)知識,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-04-04SpringBoot中隨機鹽值+雙重SHA256加密實戰(zhàn)
本文主要介紹了SpringBoot中隨機鹽值+雙重SHA256加密實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07