Springboot中的@ConditionalOnBean注解詳細(xì)解讀
@ConditionalOnMissingBean測試
首先學(xué)習(xí): @ConditionalOnMissingBean注解
兩個(gè)類,一個(gè)Computer類,一個(gè)配置類,想要完成;如果容器中沒有Computer類,就注入備用電腦Computer類,如果有Computer就不注入;
computer類:
@Data
@AllArgsConstructor
public class Computer {
public String name;
}
配置類:
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfig {
// @Bean(name = "notebookPC")
public Computer computer1() {
return new Computer("筆記本電腦");
}
// @ConditionalOnBean(Computer.class)
@ConditionalOnMissingBean(Computer.class)
@Bean("notebookPC")
public Computer computer2() {
return new Computer("備用電腦");
}
}
測試啟動類:

public class ConditionOnBeanTest extends BaseTest implements ApplicationContextAware {
@Test
public void test1() {
Map<String, Computer> beansOfType = ApplicationContext.getBeansOfType(Computer.class);
System.out.println(JSON.toJSONString(beansOfType));
}
public ApplicationContext ApplicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ApplicationContext = applicationContext;
}
}
執(zhí)行測試類:

容器中加載的是筆記本,將筆記本去掉走一波:

容器中注入的是備用電腦,很明了…

@ConditionalOnBean
再來講@ConditionalOnBean注解就會很簡單,跟@ConditionalOnMissingBean相反。 @ConditionalOnBean注解是,如果有容器中有Computer類,就注入備用電腦Computer類,如果沒有Computer就不注入;可以自己換個(gè)注解試一下就知道了,

源碼分析
一起看下@ConditionalOnMissingBean的聲明:

@Condition注解使用的是OnBeanCondition類,我們就看下這個(gè)類.這個(gè)類繼承FilteringSpringBootCondition,就看繼承的,FilteringSpringBootCondition又繼承SpringBootCondition,點(diǎn)到SpringBootCondition,看到了我們熟悉的方法,matches方法.


我們一起看看matche方法

看最重要的方法的實(shí)現(xiàn);

主要就在這個(gè)方法里面:

返回的對象:

getMatchingBeans方法比較復(fù)雜,也比較簡單,就是根據(jù)當(dāng)前上下文容器,查找是否存在對應(yīng)的類,SearchStrategy 這個(gè)枚舉定義了搜索的范圍,All就是搜索整個(gè)上下文,父子容器等等,ANCESTORS搜索所有祖先,除開當(dāng)前上下文,CURRENT,就是當(dāng)前上下文

然后就對著上下文一頓操作,返回結(jié)果.
到此這篇關(guān)于Springboot中的@ConditionalOnBean注解詳細(xì)解讀的文章就介紹到這了,更多相關(guān)@ConditionalOnBean注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決RedisTemplate調(diào)用increment報(bào)錯(cuò)問題
這篇文章主要介紹了解決RedisTemplate調(diào)用increment報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
詳解SpringBoot獲得Maven-pom中版本號和編譯時(shí)間戳
這篇文章主要介紹了詳解SpringBoot獲得Maven-pom中版本號和編譯時(shí)間戳,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
使用Spring Boot框架整合Redis的超詳細(xì)案例教程
本文詳細(xì)介紹了如何在SpringBoot項(xiàng)目中整合Redis,包括依賴配置、連接設(shè)置、基本操作和應(yīng)用案例,通過整合,可以充分利用SpringBoot和Redis的優(yōu)勢,提升應(yīng)用性能和可擴(kuò)展性,感興趣的朋友跟隨小編一起看看吧2025-11-11
解決springboot項(xiàng)目啟動失敗Could not initialize class&
這篇文章主要介紹了解決springboot項(xiàng)目啟動失敗Could not initialize class com.fasterxml.jackson.databind.ObjectMapper問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
MyBatis-Plus 集成動態(tài)多數(shù)據(jù)源的實(shí)現(xiàn)示例
本文主要介紹了MyBatis-Plus 集成動態(tài)多數(shù)據(jù)源的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
MyBatis動態(tài)SQL標(biāo)簽用法實(shí)例詳解
本文通過實(shí)例代碼給大家介紹了MyBatis動態(tài)SQL標(biāo)簽用法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-07-07

