Springboot中的@ConditionalOnBean注解詳細(xì)解讀
@ConditionalOnMissingBean測(cè)試
首先學(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("備用電腦"); } }
測(cè)試啟動(dòng)類:
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í)行測(cè)試類:
容器中加載的是筆記本,將筆記本去掉走一波:
容器中注入的是備用電腦,很明了…
@ConditionalOnBean
再來講@ConditionalOnBean注解就會(huì)很簡(jiǎn)單,跟@ConditionalOnMissingBean相反。 @ConditionalOnBean注解是,如果有容器中有Computer類,就注入備用電腦Computer類,如果沒有Computer就不注入;可以自己換個(gè)注解試一下就知道了,
源碼分析
一起看下@ConditionalOnMissingBean的聲明:
@Condition注解使用的是OnBeanCondition類,我們就看下這個(gè)類.這個(gè)類繼承FilteringSpringBootCondition,就看繼承的,FilteringSpringBootCondition又繼承SpringBootCondition,點(diǎn)到SpringBootCondition,看到了我們熟悉的方法,matches方法.
我們一起看看matche方法
看最重要的方法的實(shí)現(xiàn);
主要就在這個(gè)方法里面:
返回的對(duì)象:
getMatchingBeans方法比較復(fù)雜,也比較簡(jiǎn)單,就是根據(jù)當(dāng)前上下文容器,查找是否存在對(duì)應(yīng)的類,SearchStrategy 這個(gè)枚舉定義了搜索的范圍,All就是搜索整個(gè)上下文,父子容器等等,ANCESTORS搜索所有祖先,除開當(dāng)前上下文,CURRENT,就是當(dāng)前上下文
然后就對(duì)著上下文一頓操作,返回結(jié)果.
到此這篇關(guān)于Springboot中的@ConditionalOnBean注解詳細(xì)解讀的文章就介紹到這了,更多相關(guān)@ConditionalOnBean注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java.util.Collections類—emptyList()方法的使用
這篇文章主要介紹了java.util.Collections類—emptyList()方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Spring的FactoryBean<Object>接口示例代碼
FactoryBean是Spring框架中的一個(gè)接口,用于創(chuàng)建和管理Bean對(duì)象,它的作用是將Bean的創(chuàng)建過程交給FactoryBean實(shí)現(xiàn)類來完成,而不是直接由Spring容器來創(chuàng)建,本文給大家介紹Spring的FactoryBean<Object>接口,感興趣的朋友一起看看吧2023-11-11詳解SpringBoot如何實(shí)現(xiàn)緩存預(yù)熱
緩存預(yù)熱是指在 Spring Boot 項(xiàng)目啟動(dòng)時(shí),預(yù)先將數(shù)據(jù)加載到緩存系統(tǒng)(如 Redis)中的一種機(jī)制,下面我們就來看看SpringBoot是如何實(shí)現(xiàn)緩存預(yù)熱的吧2024-01-01Java中的main方法調(diào)用非靜態(tài)方法處理
這篇文章主要介紹了Java中的main方法調(diào)用非靜態(tài)方法處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06