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可以作用在方法上,也可以作用在類上。
- 使用的時候需要傳入實現(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)用場景
在一些需要條件滿足才是實例化的類中,使用此注解
比如項目中需要根據(jù)不同的場景使用不同的消息中間件,在消息隊列的實例化bean上,使用@Conditional注解,根據(jù)配置文件的不同,來判斷哪個bean需要加載到Spring容器中。
5、@Conditional的擴(kuò)展注解
- @ConditionalOnBean:僅在當(dāng)前上下文中存在某個對象時,才會實例化一個Bean。
- @ConditionalOnClass:某個class位于類路徑上,才會實例化一個Bean。
- @ConditionalOnExpression:當(dāng)表達(dá)式值為true的時候,才會實例化一個Bean。
- @ConditionalOnMissingBean:僅僅在當(dāng)前上下文中不存在某個對象時,才會實例化一個Bean。
- @ConditionalOnMissingClass:某個class類路徑上不存在的時候,才會實例化一個Bean。
- @ConditionalOnNotWebApplication:非web應(yīng)用,才會實例化一個Bean。
- @ConditionalOnBean:當(dāng)容器中有指定Bean的條件下進(jìn)行實例化。
- @ConditionalOnMissingBean:當(dāng)容器里沒有指定Bean的條件下進(jìn)行實例化。
- @ConditionalOnClass:當(dāng)classpath類路徑下有指定類的條件下進(jìn)行實例化。
- @ConditionalOnMissingClass:當(dāng)類路徑下沒有指定類的條件下進(jìn)行實例化。
- @ConditionalOnWebApplication:當(dāng)項目是一個Web項目時進(jìn)行實例化。
- @ConditionalOnNotWebApplication:當(dāng)項目不是一個Web項目時進(jìn)行實例化。
- @ConditionalOnProperty:當(dāng)指定的屬性有指定的值時進(jìn)行實例化。
- @ConditionalOnExpression:基于SpEL表達(dá)式的條件判斷。
- @ConditionalOnJava:當(dāng)JVM版本為指定的版本范圍時觸發(fā)實例化。
- @ConditionalOnResource:當(dāng)類路徑下有指定的資源時觸發(fā)實例化。
- @ConditionalOnJndi:在JNDI存在的條件下觸發(fā)實例化。
- @ConditionalOnSingleCandidate:當(dāng)指定的Bean在容器中只有一個,或者有多個但是指定了首選的Bean時,才會觸發(fā)實例化。
到此這篇關(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-03
JavaSE的三大接口:Comparator,Comparable和Cloneable詳解
這篇文章主要介紹了詳解JavaSE中Comparator,Comparable和Cloneable接口的區(qū)別的相關(guān)資料,希望通過本文大家能徹底掌握這部分內(nèi)容,需要的朋友可以參考下2021-10-10
java使用listIterator逆序arraylist示例分享
對于列表而言,除了Iterator,還提供了一個功能更加強大的ListIterator。它可以實現(xiàn)逆序遍歷列表中的元素。本示例將使用其逆序遍歷ArrayList2014-02-02
RestTemplate使用不當(dāng)引發(fā)的問題及解決
這篇文章主要介紹了RestTemplate使用不當(dāng)引發(fā)的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
使用Spring?Boot如何限制在一分鐘內(nèi)某個IP只能訪問10次
有些時候,為了防止我們上線的網(wǎng)站被攻擊,或者被刷取流量,我們會對某一個ip進(jìn)行限制處理,這篇文章,我們將通過Spring?Boot編寫一個小案例,來實現(xiàn)在一分鐘內(nèi)同一個IP只能訪問10次,感興趣的朋友一起看看吧2023-10-10

