Spring @Conditional注解原理解析
這篇文章主要介紹了Spring @Conditional注解原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(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)行對(duì)容器加載不同的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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Tomcat 服務(wù)器 在45秒內(nèi)未啟動(dòng)成功的解決方法
下面小編就為大家?guī)硪黄猅omcat 服務(wù)器 在45秒內(nèi)未啟動(dòng)成功的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Java學(xué)習(xí)教程之定時(shí)任務(wù)全家桶
這篇文章主要給大家介紹了關(guān)于Java學(xué)習(xí)教程之定時(shí)任務(wù)全家桶的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Spring Boot Admin(監(jiān)控工具)的使用
今天我們將會(huì)講解一個(gè)優(yōu)秀的監(jiān)控工具Spring Boot Admin。 它采用圖形化的界面,讓我們的Spring Boot管理更加簡單,需要的朋友可以參考下2020-02-02詳解Java的Hibernate框架中的Interceptor和Collection
這篇文章主要介紹了Java的Hibernate框架中的Interceptor和Collection,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2016-01-01LRU算法及Apache?LRUMap源碼實(shí)例解析
這篇文章主要給大家介紹了關(guān)于LRU算法及Apache?LRUMap源碼解析的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11在navicat中導(dǎo)入mysql數(shù)據(jù)庫詳細(xì)步驟(即.sql后綴的數(shù)據(jù)庫)
Navicat是MySQL非常好用的可視化管理工具,功能非常強(qiáng)大,能滿足我們?nèi)粘?shù)據(jù)庫開發(fā)的所有需求,下面這篇文章主要給大家介紹了關(guān)于如何在navicat中導(dǎo)入mysql數(shù)據(jù)庫(即.sql后綴的數(shù)據(jù)庫)的相關(guān)資料,需要的朋友可以參考下2023-04-04Java使用雪花算法生成唯一ID的實(shí)現(xiàn)示例
雪花算法是 Twitter 開源的一種分布式ID生成算法,其目的是生成全局唯一的 ID,本文主要介紹了Java使用雪花算法生成唯一ID的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07