天天看點

SpringBoot系列之@Conditional注解用法簡介

SpringBoot系列之@Conditional注解用法簡介

引用Spring官方文檔的說法介紹一下@Conditional注解:​​Spring5.0.15版本@Conditional注解官方文檔​​

@Conditional表示僅當所有指定條件都比對時,元件才有資格注冊 。

該@Conditional注釋可以在以下任一方式使用:

  • 作為任何@Bean方法的方法級注釋
  • 作為任何類的直接或間接注釋的類型級别注釋 @Component,包括@Configuration類
  • 作為元注釋,目的是組成自定義構造型注釋

改注解主要源碼之一,通過match比對,符合條件才裝載到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指定的條件成立,才給容器添加元件

@Conditional派生注解:@Conditional派生了很多注解,下面給個表格列舉一下派生注解的用法

@Conditional派生注解 作用(都是判斷是否符合指定的條件)
@ConditionalOnJava 系統的java版本是否符合要求
@ConditionalOnBean 有指定的Bean類
@ConditionalOnMissingBean 沒有指定的bean類
@ConditionalOnExpression 符合指定的SpEL表達式
@ConditionalOnClass 有指定的類
@ConditionalOnMissingClass 沒有指定的類
@ConditionalOnSingleCandidate 容器隻有一個指定的bean,或者這個bean是首選bean
@ConditionalOnProperty 指定的property屬性有指定的值
@ConditionalOnResource 路徑下存在指定的資源
@ConditionalOnWebApplication 系統環境是web環境
@ConditionalOnNotWebApplication