SpringBoot條件註解@Conditional
最近專案中使用到了關於@Conditional註解的一些特性,故寫此文記錄一下
@Conditional是啥呀?
@Conditional註解是個什麼東西呢,它可以根據程式碼中設定的條件裝載不同的bean,比如說當一個介面有兩個實現類時,我們要把這個介面交給Spring管理時通常會只選擇實現其中一個實現類,這個時候我們總不能使用if-else吧,所以這個@Conditional的註解就出現了。
我怎麼用它呢?
在SpringBoot中,@Conditional註解並不是孤軍奮鬥,它們是一個家族,我們來看一下它們其中的幾個成員,又都是怎麼用的
- @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)根據註解等等騷操作都可以
- @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,在比如說你想自定義。那這個時候怎麼辦呢,那咱們就來自定義一個。
- 首先自定義一個規則類
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 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,轉載請保留。