Spring @Conditional注解原理解析
這篇文章主要介紹了Spring @Conditional注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
@Conditional是Spring4新提供的注解,它的作用是根據(jù)某個(gè)條件加載特定的bean。
我們需要?jiǎng)?chuàng)建實(shí)現(xiàn)類來實(shí)現(xiàn)Condition接口,這是Condition的源碼
public interface Condition {
boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
所以我們需要重寫matches方法,該方法返回boolean類型。
首先我們準(zhǔn)備根據(jù)不同的操作系統(tǒng)環(huán)境進(jìn)行對容器加載不同的bean,先創(chuàng)建Person
public class Person {
}
創(chuàng)建實(shí)現(xiàn)類LinuxCondition和WindowCondiction,
LinuxCondition:
public class WindowCondiction implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return true;
}
}
WindowCondiction:
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return true;
}
}
配置類:給相應(yīng)的bean加上 @Conditional注解,里面的括號(hào)將返回boolean類型,返回true則加載bean
@Configuration
public class MainConfig {
@Profile("window")
@Conditional(WindowCondiction.class)
@Bean
public Person person01(){
return new Person("李思",30);
}
@Profile("linux")
@Conditional(LinuxCondition.class)
@Bean
public Person person02(){
return new Person("wangwu",35);
}
}
測試:現(xiàn)在是按照linux環(huán)境,@Profile注解先匹配linux的bean,再根據(jù)@Conditional 返回的類型判斷是否加載bean,這里都設(shè)置返回true,所以應(yīng)該打印
Person{name='wangwu', age=35}
public class CondictionTest {
@Test
public void test(){
//創(chuàng)建容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
//設(shè)置需要激活的環(huán)境
applicationContext.getEnvironment().setActiveProfiles("linux");
//設(shè)置主配置類
applicationContext.register(MainProfileConfig.class);
//啟動(dòng)刷新容器
applicationContext.refresh();
String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class);
for (String name : beanNamesForType){
System.out.println(name);
}
applicationContext.close();
}
}
如果把LinuxCondition的返回值該為false,會(huì)報(bào)找不到bean的異常
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.springbean.Person' available
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Java編寫導(dǎo)出不確定行數(shù)列數(shù)數(shù)據(jù)的工具類
這篇文章主要為大家詳細(xì)介紹了如何使用Java編寫導(dǎo)出不確定行數(shù)列數(shù)數(shù)據(jù)的工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用
Spring?Boot2.6.0為我們帶來很多好用的新特性/改進(jìn),這篇文章主要給大家介紹了關(guān)于Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
Java微信公眾平臺(tái)開發(fā)(8) 多媒體消息回復(fù)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開發(fā)第八步,微信多媒體消息回復(fù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
使用IDEA異常斷點(diǎn)來定位java.lang.ArrayStoreException的問題
這篇文章主要介紹了使用IDEA異常斷點(diǎn)來定位java.lang.ArrayStoreException的問題,平常開發(fā)過程中面對這種描述不夠清楚,無法定位具體原因的問題該如何處理,下面我們來一起學(xué)習(xí)一下吧2019-06-06
Mybatis自關(guān)聯(lián)查詢一對多查詢的實(shí)現(xiàn)示例
這篇文章主要介紹了Mybatis自關(guān)聯(lián)查詢一對多查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
java中l(wèi)ist.forEach()和list.stream().forEach()區(qū)別
這篇文章主要介紹了java中l(wèi)ist.forEach()和list.stream().forEach()區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Spring Boot 2.x基礎(chǔ)教程之使用@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)的方法
在Spring Boot中編寫定時(shí)任務(wù)是非常簡單的事,下面通過實(shí)例介紹如何在Spring Boot中創(chuàng)建定時(shí)任務(wù),實(shí)現(xiàn)每過5秒輸出一個(gè)當(dāng)前時(shí)間,感興趣的朋友跟隨小編一起看看吧2021-07-07

