簡要說明
@Conditional注解來源于org.springframework.context.annotation包中,也就是它是Spring中的注解,并不是SpringBoot的注解,他的作用是為了bean的裝載到容器中增加一個條件判斷,在滿足條件下才會裝載到容器中,這個條件的實現我們可以進行自定義的。
它存在很多擴展注解(SpringBoot對conditional注解的擴展),如下:
-
@ConditionalOnBean
-
@ConditionalOnProperty
-
@ConditionalOnClass
-
@ConditionalOnMissingBean
-
@ConditionalOnMissingClass
-
@ConditionalOnExpression
-
。。。。
以上的注解均來自org.springframework.boot.autoconfigure.condition包中,即都是springboot進行擴展的注解
自定義加載條件類
1.創建自定義bean加載條件的類,并實現Condition接口,重寫matches方法
public class OnXXXXXCondition implements Condition{@Overridepublic final boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {。。。。。。}
}
2.在需要添加條件加載的類或者方法是使用@Conditional注解,并將自定義加載條件類作為參數加入到@Conditional中
@Conditional(OnXXXXXCondition.class)
public @interface ConditionalOnXXXX {.....
}
SpringBoot相關注解詳解
@ConditionalOnProperty(重)
這個注解在使用場景中是頻繁和重要的,如我們自定義springboot的Starter時,增加對該組件開關的配置信息等。
@Configuration
@ConditionalOnProperty(value="xxx.yyy",havingValue="true",matchIfMissing="ture")
public class TestBean{...
}
這個條件解釋是: application.properties 或 application.yml 文件中 xxx.yyy 為 true 才會加載 TestBean 這個 Bean,如果沒有匹配上也會加載,因為 matchIfMissing = true,默認值是 false,通常設置為false。
@ConditionalOnBean 和 ConditionalOnMissingBean
有時候我們需要某個 Bean 已經存在應用上下文時才會加載,那么我們會用到 @ConditionalOnBean`注解,
@Configuration
@ConditionalOnBean(OtherBean.class)
public class TestBean{...
}
反之有時候我們需要某個 Bean 不存在于應用上下文時才會加載,那么我們會用到@ConditionalOnMissingBean 注解。
@ConditionalOnClass 和 @ConditionalOnMissingClass
和上一個用法一致,只不過判斷某個類是否存在于 classpath 中作為加載條件,@ConditionalOnClass判斷存在, @ConditionalOnMissingClass判斷不存在。
@ConditionalOnExpression
如果我們有更復雜的多個配置屬性一起判斷,那么我們就可以用這個表達式了:
@Configuration
@ConditionalOnExpression("${xxx.yyy:ture} and ${zzz.kkk}:ture")
public class TestBean{...
}
只有當兩個屬性都為 true 的時候才加載
。。。。