Spring @Conditional注解原理解析
這篇文章主要介紹了Spring @Conditional注解原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
@Conditional是Spring4新提供的注解,它的作用是根據(jù)某個(gè)條件加載特定的bean。
我們需要?jiǎng)?chuàng)建實(shí)現(xiàn)類(lèi)來(lái)實(shí)現(xiàn)Condition接口,這是Condition的源碼
public interface Condition {
boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
所以我們需要重寫(xiě)matches方法,該方法返回boolean類(lèi)型。
首先我們準(zhǔn)備根據(jù)不同的操作系統(tǒng)環(huán)境進(jìn)行對(duì)容器加載不同的bean,先創(chuàng)建Person
public class Person {
}
創(chuàng)建實(shí)現(xiàn)類(lèi)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;
}
}
配置類(lèi):給相應(yīng)的bean加上 @Conditional注解,里面的括號(hào)將返回boolean類(lèi)型,返回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);
}
}
測(cè)試:現(xiàn)在是按照l(shuí)inux環(huán)境,@Profile注解先匹配linux的bean,再根據(jù)@Conditional 返回的類(lèi)型判斷是否加載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è)置主配置類(lèi)
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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Tomcat 服務(wù)器 在45秒內(nèi)未啟動(dòng)成功的解決方法
下面小編就為大家?guī)?lái)一篇Tomcat 服務(wù)器 在45秒內(nèi)未啟動(dòng)成功的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
Java學(xué)習(xí)教程之定時(shí)任務(wù)全家桶
這篇文章主要給大家介紹了關(guān)于Java學(xué)習(xí)教程之定時(shí)任務(wù)全家桶的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Spring Boot Admin(監(jiān)控工具)的使用
今天我們將會(huì)講解一個(gè)優(yōu)秀的監(jiān)控工具Spring Boot Admin。 它采用圖形化的界面,讓我們的Spring Boot管理更加簡(jiǎn)單,需要的朋友可以參考下2020-02-02
詳解Java的Hibernate框架中的Interceptor和Collection
這篇文章主要介紹了Java的Hibernate框架中的Interceptor和Collection,Hibernate是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2016-01-01
LRU算法及Apache?LRUMap源碼實(shí)例解析
這篇文章主要給大家介紹了關(guān)于LRU算法及Apache?LRUMap源碼解析的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11
在navicat中導(dǎo)入mysql數(shù)據(jù)庫(kù)詳細(xì)步驟(即.sql后綴的數(shù)據(jù)庫(kù))
Navicat是MySQL非常好用的可視化管理工具,功能非常強(qiáng)大,能滿(mǎn)足我們?nèi)粘?shù)據(jù)庫(kù)開(kāi)發(fā)的所有需求,下面這篇文章主要給大家介紹了關(guān)于如何在navicat中導(dǎo)入mysql數(shù)據(jù)庫(kù)(即.sql后綴的數(shù)據(jù)庫(kù))的相關(guān)資料,需要的朋友可以參考下2023-04-04
Java使用雪花算法生成唯一ID的實(shí)現(xiàn)示例
雪花算法是 Twitter 開(kāi)源的一種分布式ID生成算法,其目的是生成全局唯一的 ID,本文主要介紹了Java使用雪花算法生成唯一ID的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07

