1. 程式人生 > >SpringBoot條件註解@Conditional

SpringBoot條件註解@Conditional

最近專案中使用到了關於@Conditional註解的一些特性,故寫此文記錄一下

@Conditional是啥呀?

@Conditional註解是個什麼東西呢,它可以根據程式碼中設定的條件裝載不同的bean,比如說當一個介面有兩個實現類時,我們要把這個介面交給Spring管理時通常會只選擇實現其中一個實現類,這個時候我們總不能使用if-else吧,所以這個@Conditional的註解就出現了。

我怎麼用它呢?

在SpringBoot中,@Conditional註解並不是孤軍奮鬥,它們是一個家族,我們來看一下它們其中的幾個成員,又都是怎麼用的

  1. @ConditionalOnBean
    示例程式碼
1
2
3
4
5
6
7
8
9
@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家族的成員我們只講了其中的一小部分
    它的家族成員大概有這麼多:
    圖片
    想要深入瞭解的童鞋可以參考一下這個包
    org.springframework.boot.autoconfigure.condition

雖然上邊你講了很多,但是我還是不滿意

為什麼不滿意呢,其實原因有很多,比如說你沒有用過SpringBoot,在比如說你想自定義。那這個時候怎麼辦呢,那咱們就來自定義一個。

  1. 首先自定義一個規則類
1
2
3
4
5
6
7
8
9
public class MyCondition implements Condition    
{    
      
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)    
    {    
    		//在這裡寫你的邏輯,比如說你想a>0時例項化類A,a<0時不實現
        return a>0;    
    }    
}
  1. 然後你就可以用了
1
2
3
4
5
@Bean
    @Conditional(MyCondition.class)
    public A a(){
    	return new A()
    }

看看別人怎麼用的

相信看完上方的幾步你已經學會了如何跟@Conditional家族打招呼了。那麼你願意來看一下我是怎麼用的麼?
https://github.com/2388386839/syj-ratelimit

本文出自http://zhixiang.org.cn,轉載請保留。