首頁 >Java >java教程 >SpringBoot中@Conditional註解是什麼?怎麼用?

SpringBoot中@Conditional註解是什麼?怎麼用?

不言
不言原創
2018-09-26 14:36:282889瀏覽

這篇文章帶給大家的內容是關於SpringBoot中@Conditional註解是什麼?怎麼用?有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

最近專案中使用到了關於@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)根據註解等等騷操作都可以

  1. @ConditionalOnMissingBean
    這個只比1多了個Missing,啥意思呢,見名知意,就是不存在某個bean的時候實例化。

  2. @ConditionalOnClass(存在某個類別時,才會實例化一個Bean)

  3. @ConditionalOnMissingClass(不存在某個類別時,才會實例化一個Bean)

  4. @ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “token”)
    這個就稍微複雜了一點,它的意思呢就是當存在設定檔中以syj為前綴的屬性,屬性名稱為algorithm,然後它的值為token時才會實例化一個類別。

    而且這個還有一個比較好的屬性
    @ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “counter”, matchIfMissing = true)
    matchIfMissing的意思呢就是說如果所有的都不滿足的話就默認實現,不管這個屬性syj.algorithm是不是等於counter

  5. @ConditionalOnJava(如果是Java應用)

  6. #@ConditionalOnWebApplication(如果是Web應用)
    其實說到這@Conditional家族的成員我們只講了其中的一小部分
    它的家族成員大概有這麼多:
    SpringBoot中@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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn