Spring中@Conditional注解用法詳解
1、@Conditional注解介紹
@Conditional是Spring4版本新提供的一種注解
它的作用是按照設(shè)定的條件進(jìn)行判斷,把滿足判斷條件的bean注冊到Spring容器。
2、@Conditional的源碼
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Conditional { /** * All {@link Condition Conditions} that must {@linkplain Condition#matches match} * in order for the component to be registered. */ Class<? extends Condition>[] value(); }
說明:
- @Conditional可以作用在方法上,也可以作用在類上。
- 使用的時候需要傳入實(shí)現(xiàn)Condition接口類數(shù)組。
- 如果是類和方法都加了@Conditional注解,最終在方法上的注解為最終的條件,如果返回true則加入容器,反之不會加入容器。
- 如果只是類上加了@Conditional注解,整個類的所有方法都會加入容器中。
3、用法示例
3.1 新建Book.java 文件
package com.spring.bean; public class Book { private String bookName; private String bookType; private double price; public Book(String bookName, String bookType, double price) { this.bookName = bookName; this.bookType = bookType; this.price = price; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public String getBookType() { return bookType; } public void setBookType(String bookType) { this.bookType = bookType; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Book{" + "bookName='" + bookName + '\'' + ", bookType='" + bookType + '\'' + ", price=" + price + '}'; } }
3.2 CNCondition.java 文件
package com.spring.condition; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; public class CNCondition implements Condition { public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { // user.language=CN 表示中文返回 true return conditionContext.getEnvironment().getProperty("user.language").contains("cn"); } }
3.3 ZHCondition.java 文件
package com.spring.condition; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; public class ZHCondition implements Condition { public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { // user.language=ZH Java默認(rèn)語言 表示中文返回 true return conditionContext.getEnvironment() .getProperty("user.language").contains("zh"); } }
3.4 新建TestConditionalConfig.java 配置文件
package com.spring.config; import com.spring.bean.Book; import com.spring.condition.CNCondition; import com.spring.condition.ZHCondition; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; @Configuration @Conditional(ZHCondition.class) public class TestConditionalConfig { @Bean @Conditional(ZHCondition.class)//中文 public Book bookZH() { return new Book("紅樓夢","中國古典書籍",99.9); } @Bean @Conditional(CNCondition.class)//英文 public Book bookCN() { return new Book("哈姆雷特","外國經(jīng)典名著",66.6); } }
3.5 新建TestConditional.java 測試文件
package com.spring.test; import com.spring.bean.Book; import com.spring.config.TestConditionalConfig; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.Map; public class TestConditional { public static void main(String[] args) { AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(TestConditionalConfig.class); Map<String, Book> map = annotationContext.getBeansOfType(Book.class); System.out.println(map); } }
4、@Conditional應(yīng)用場景
在一些需要條件滿足才是實(shí)例化的類中,使用此注解
比如項(xiàng)目中需要根據(jù)不同的場景使用不同的消息中間件,在消息隊(duì)列的實(shí)例化bean上,使用@Conditional注解,根據(jù)配置文件的不同,來判斷哪個bean需要加載到Spring容器中。
5、@Conditional的擴(kuò)展注解
- @ConditionalOnBean:僅在當(dāng)前上下文中存在某個對象時,才會實(shí)例化一個Bean。
- @ConditionalOnClass:某個class位于類路徑上,才會實(shí)例化一個Bean。
- @ConditionalOnExpression:當(dāng)表達(dá)式值為true的時候,才會實(shí)例化一個Bean。
- @ConditionalOnMissingBean:僅僅在當(dāng)前上下文中不存在某個對象時,才會實(shí)例化一個Bean。
- @ConditionalOnMissingClass:某個class類路徑上不存在的時候,才會實(shí)例化一個Bean。
- @ConditionalOnNotWebApplication:非web應(yīng)用,才會實(shí)例化一個Bean。
- @ConditionalOnBean:當(dāng)容器中有指定Bean的條件下進(jìn)行實(shí)例化。
- @ConditionalOnMissingBean:當(dāng)容器里沒有指定Bean的條件下進(jìn)行實(shí)例化。
- @ConditionalOnClass:當(dāng)classpath類路徑下有指定類的條件下進(jìn)行實(shí)例化。
- @ConditionalOnMissingClass:當(dāng)類路徑下沒有指定類的條件下進(jìn)行實(shí)例化。
- @ConditionalOnWebApplication:當(dāng)項(xiàng)目是一個Web項(xiàng)目時進(jìn)行實(shí)例化。
- @ConditionalOnNotWebApplication:當(dāng)項(xiàng)目不是一個Web項(xiàng)目時進(jìn)行實(shí)例化。
- @ConditionalOnProperty:當(dāng)指定的屬性有指定的值時進(jìn)行實(shí)例化。
- @ConditionalOnExpression:基于SpEL表達(dá)式的條件判斷。
- @ConditionalOnJava:當(dāng)JVM版本為指定的版本范圍時觸發(fā)實(shí)例化。
- @ConditionalOnResource:當(dāng)類路徑下有指定的資源時觸發(fā)實(shí)例化。
- @ConditionalOnJndi:在JNDI存在的條件下觸發(fā)實(shí)例化。
- @ConditionalOnSingleCandidate:當(dāng)指定的Bean在容器中只有一個,或者有多個但是指定了首選的Bean時,才會觸發(fā)實(shí)例化。
到此這篇關(guān)于Spring中@Conditional注解用法詳解的文章就介紹到這了,更多相關(guān)@Conditional注解用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法
這篇文章主要介紹了Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法的相關(guān)資料,需要的朋友可以參考下2017-03-03Java實(shí)現(xiàn)Token登錄驗(yàn)證的項(xiàng)目實(shí)踐
本文主要介紹了Java實(shí)現(xiàn)Token登錄驗(yàn)證的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03JavaSE的三大接口:Comparator,Comparable和Cloneable詳解
這篇文章主要介紹了詳解JavaSE中Comparator,Comparable和Cloneable接口的區(qū)別的相關(guān)資料,希望通過本文大家能徹底掌握這部分內(nèi)容,需要的朋友可以參考下2021-10-10java使用listIterator逆序arraylist示例分享
對于列表而言,除了Iterator,還提供了一個功能更加強(qiáng)大的ListIterator。它可以實(shí)現(xiàn)逆序遍歷列表中的元素。本示例將使用其逆序遍歷ArrayList2014-02-02RestTemplate使用不當(dāng)引發(fā)的問題及解決
這篇文章主要介紹了RestTemplate使用不當(dāng)引發(fā)的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10使用Spring?Boot如何限制在一分鐘內(nèi)某個IP只能訪問10次
有些時候,為了防止我們上線的網(wǎng)站被攻擊,或者被刷取流量,我們會對某一個ip進(jìn)行限制處理,這篇文章,我們將通過Spring?Boot編寫一個小案例,來實(shí)現(xiàn)在一分鐘內(nèi)同一個IP只能訪問10次,感興趣的朋友一起看看吧2023-10-10