這篇文章帶給大家的內容是關於SpringBoot中@Conditional註解是什麼?怎麼用?有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
最近專案中使用到了關於@Conditional註解的一些特性,故寫此文記錄一下
@Conditional註解是個什麼東西呢,它可以根據程式碼中設定的條件裝載不同的bean,比如說當一個介面有兩個實作類別時,我們要把這個介面交給Spring管理時通常會只選擇實作其中一個實作類,這時候我們總不能使用if-else吧,所以這個@Conditional的註解就出現了。
在SpringBoot中,@Conditional註解並不是孤軍奮鬥,它們是一個家族,我們來看一下它們其中的幾個成員,又都是怎麼用的
@ ConditionalOnBean
範例程式碼
@Bean @ConditionalOnBean(RedisConnectionFactory.class) public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>(); template.setConnectionFactory(connectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; }
這個方法上加了@ConditionalOnBean註解,註解裡的屬性是RedisConnectionFactory。它的意思呢,是說如果你配置了redis的相關配置資訊那麼我就實例化RedisTemplate供你進行操作,如果你沒有配置redis的相關配置那麼我就不實例化(畢竟沒有配置實例化也報錯不是)
不僅如此,你也可以這樣玩:
根據bean的名字@ConditionalOnMissingBean(name = “connectionFactory”)或者@ConditionalOnMissingBean(annotation = EnableSyjRateLimit.class)根據註解等等騷操作都可以
@ConditionalOnMissingBean
這個只比1多了個Missing,啥意思呢,見名知意,就是不存在某個bean的時候實例化。
@ConditionalOnClass(存在某個類別時,才會實例化一個Bean)
@ConditionalOnMissingClass(不存在某個類別時,才會實例化一個Bean)
@ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “token”)
這個就稍微複雜了一點,它的意思呢就是當存在設定檔中以syj為前綴的屬性,屬性名稱為algorithm,然後它的值為token時才會實例化一個類別。
而且這個還有一個比較好的屬性
@ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “counter”, matchIfMissing = true)
matchIfMissing的意思呢就是說如果所有的都不滿足的話就默認實現,不管這個屬性syj.algorithm是不是等於counter
@ConditionalOnJava(如果是Java應用)
#@ConditionalOnWebApplication(如果是Web應用)
其實說到這@Conditional家族的成員我們只講了其中的一小部分
它的家族成員大概有這麼多:
想要深入了解的童鞋可以參考一下這個包
org.springframework.boot.autoconfigure.condition
為什麼不滿意呢,其實原因很多,比如說你沒有用過SpringBoot,比如說你想自訂。那這個時候怎麼辦呢,那咱們就來自訂一個。
先自訂一個規則類別
public class MyCondition implements Condition { public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //在这里写你的逻辑,比如说你想a>0时实例化类A,a<0时不实现 return a>0; } }
然後你就可以用了
@Bean @Conditional(MyCondition.class) public A a(){ return new A() }
以上是SpringBoot中@Conditional註解是什麼?怎麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!