SpringBoot系列之@Conditional註解用法簡介html
引用Spring官方文檔的說法介紹一下@Conditional註解:Spring5.0.15版本@Conditional註解官方文檔java
@Conditional表示僅當全部指定條件都匹配時,組件纔有資格註冊 。
該@Conditional註釋能夠在如下任一方式使用:web
- 做爲任何@Bean方法的方法級註釋
- 做爲任何類的直接或間接註釋的類型級別註釋 @Component,包括@Configuration類
- 做爲元註釋,目的是組成自定義構造型註釋
改註解主要源碼之一,經過match匹配,符合條件才裝載到Spring容器spring
@Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { if (context.getEnvironment() != null) { // Read the @Profile annotation attributes MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName()); if (attrs != null) { for (Object value : attrs.get("value")) { if (context.getEnvironment().acceptsProfiles(((String[]) value))) { return true; } } return false; } } return true; }
做用:總而言之,只有@Conditional指定的條件成立,纔給容器添加組件api
@Conditional派生註解:@Conditional派生了不少註解,下面給個表格列舉一下派生註解的用法ide
@Conditional派生註解 | 做用(都是判斷是否符合指定的條件) |
---|---|
@ConditionalOnJava | 系統的java版本是否符合要求 |
@ConditionalOnBean | 有指定的Bean類 |
@ConditionalOnMissingBean | 沒有指定的bean類 |
@ConditionalOnExpression | 符合指定的SpEL表達式 |
@ConditionalOnClass | 有指定的類 |
@ConditionalOnMissingClass | 沒有指定的類 |
@ConditionalOnSingleCandidate | 容器只有一個指定的bean,或者這個bean是首選bean |
@ConditionalOnProperty | 指定的property屬性有指定的值 |
@ConditionalOnResource | 路徑下存在指定的資源 |
@ConditionalOnWebApplication | 系統環境是web環境 |
@ConditionalOnNotWebApplication | 系統環境不是web環境 |
@ConditionalOnjndi | JNDI存在指定的項 |