根據條件加載 bean:即 @ConditionalOnXxx 的解析


(version: SpringBoot 2.2.2.RELEASE)

加載 @Configration 類,或者 @Configuration 類里面的 beanMethod 時,通常會用到條件加載,即:@CondtionalOnXxx

1. org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass()
    1.1 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.TrackedConditionEvaluator#shouldSkip()

 

具體的實現代碼如下:
org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.TrackedConditionEvaluator#shouldSkip()

public boolean shouldSkip(ConfigurationClass configClass) {
    Boolean skip = this.skipped.get(configClass);
    if (skip == null) {
        if (configClass.isImported()) {
            boolean allSkipped = true;
            for (ConfigurationClass importedBy : configClass.getImportedBy()) {
                if (!shouldSkip(importedBy)) {
                    allSkipped = false;
                    break;
                }
            }
            if (allSkipped) {
                // The config classes that imported this one were all skipped, therefore we are skipped...
                skip = true;
            }
        }
        if (skip == null) {
            // 通過表達式來判斷是否要 skip:即 @ConditionalOnBean、@ConditionOnClass、@ConditionalOnMissingClass、@ConditionalOnExpression 等的處理
            skip = conditionEvaluator.shouldSkip(configClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN);
        }
        this.skipped.put(configClass, skip);
    }
    return skip;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM