SpringBoot?實(shí)現(xiàn)自定義的?@ConditionalOnXXX?注解示例詳解
實(shí)現(xiàn)一個(gè)自定義的 @Conditional 派生注解
自定義一個(gè)注解,繼承 @Conditional 注解
// 派生注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(CustomConditional.class)
public @interface ConditionalOnCustom {
String[] value() default {};
}注解的處理類
public class CustomConditional implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 獲取到自定義注解中的 value 值
String[] properties = (String[]) metadata.getAnnotationAttributes("smoketest.test.condition.ConditionalOnCustom").get("value");
// 遍歷自定義屬性的 value 值
for (String property : properties) {
// 獲取定義在配置文件中的值,并且 equals("customBean") 則返回 true
if ("customBean".equals(context.getEnvironment().getProperty(property))) {
return true;
}
}
return false;
}
}
使用注解
@Component
@ConditionalOnCustom({"smoketest.test.condition.bean"})
public class ConditionalUse {
}application.properties 中配置變量
smoketest.test.condition.bean = customBean
獲取 ConditionalUse 對(duì)象
@SpringBootApplication
@ConfigurationPropertiesScan
public class SampleTestApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SampleTestApplication.class, args);
ConditionalUse bean = context.getBean(ConditionalUse.class);
System.out.println(bean);
}
}
程序啟動(dòng)可以看到成功獲取 ConditionalUse 對(duì)象

Conditional 派生注解的類如何注入到 spring 容器
@Conditional 注解在 spring 的 ConfigurationClassParse 類中會(huì)調(diào)用 ConditionEvaluator.shouldSkip() 方法進(jìn)行判斷,Condition 接口的 matches() 是否返回 true,如果返回 true,就實(shí)例化對(duì)象,并注冊(cè)到 spring 容器中

- shouldSkip() 這個(gè)方法執(zhí)行的邏輯主要是如果是解析階段則跳過,如果是注冊(cè)階段則不跳過
- 如果是在注冊(cè)階段即 REGISTER_BEAN 階段的話,此時(shí)會(huì)得到所有的 Condition 接口的具體實(shí)現(xiàn)類并實(shí)例化這些實(shí)現(xiàn)類,然后再執(zhí)行下面關(guān)鍵的代碼進(jìn)行判斷是否需要跳過
if ((requiredPhase == null || requiredPhase == phase) && !condition.matches(this.context, metadata)) { return true; }- 上面代碼最重要的邏輯是調(diào)用 Condition 接口的具體實(shí)現(xiàn)類的 matches() 方法,若 matches() 返回 false,則跳過,不進(jìn)行注冊(cè) bean 的操作
- 若 matches() 返回 true,則不跳過,進(jìn)行注冊(cè) bean 的操作
到此這篇關(guān)于SpringBoot 實(shí)現(xiàn)自定義的 @ConditionalOnXXX 注解示例詳解的文章就介紹到這了,更多相關(guān)SpringBoot @ConditionalOnXXX 注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java.toCharArray()和charAt()的效率對(duì)比分析
這篇文章主要介紹了Java.toCharArray()和charAt()的效率對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Springcloud微服務(wù)架構(gòu)基礎(chǔ)知識(shí)解析
這篇文章主要介紹了Springcloud微服務(wù)架構(gòu)基礎(chǔ)知識(shí)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java利用位運(yùn)算實(shí)現(xiàn)乘法運(yùn)算詳解
這篇文章主要為大家詳細(xì)介紹了Java如何用位運(yùn)算實(shí)現(xiàn)乘法運(yùn)算,在實(shí)現(xiàn)乘法時(shí)要用位運(yùn)算實(shí)現(xiàn),并且不能出現(xiàn)加減乘除任何符號(hào),感興趣的可以了解一下2023-04-04
Java 異步編程實(shí)踐_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
異步編程提供了一個(gè)非阻塞的,事件驅(qū)動(dòng)的編程模型。下面通過本文給大家介紹Java 異步編程實(shí)踐,感興趣的的朋友一起看看吧2017-05-05
java.io.IOException:你的主機(jī)中的軟件中止了一個(gè)已建立的連接踩坑實(shí)戰(zhàn)
最近在工作中遇到了個(gè)問題,分享給同樣遇到問題的同學(xué),這篇文章主要給大家介紹了關(guān)于java.io.IOException:你的主機(jī)中的軟件中止了一個(gè)已建立的連接的踩坑實(shí)戰(zhàn)記錄,需要的朋友可以參考下2023-03-03
Mybatis讀取和存儲(chǔ)json類型數(shù)據(jù)的實(shí)現(xiàn)
本文主要介紹了Mybatis讀取和存儲(chǔ)json類型數(shù)據(jù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
springmvc的validator數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)示例代碼
這篇文章主要介紹了springmvc的數(shù)據(jù)校驗(yàn)的實(shí)現(xiàn)示例代碼, 具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07

