Spring容器(四): BeanFactoryPostProcessor方法調(diào)用

在創(chuàng)建、準(zhǔn)備BeanFactory環(huán)境的流程結(jié)束后,在invokeBeanFactoryPostProcessors方法中,spring開(kāi)始查找項(xiàng)目中定義的BeanFactoryPostProcessor,按照PriorityOrdered->Ordered->normal 順序調(diào)用BeanFactoryPostProcessor的方法,為容器注入新的類(lèi):比如BeanPostProcessor(并沒(méi)有初始化,只是保存了類(lèi)名)。

1. invokeBeanFactoryPostProcessors 方法

invokeBeanFactoryPostProcessors(
            ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors){

    if (beanFactory instanceof BeanDefinitionRegistry) {
        ...
        //找到BeanFactory創(chuàng)建之初,spring默認(rèn)添加的ConfigurationClassPostProcessor
       String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

        //優(yōu)先執(zhí)行implement了PriorityOrdered 的 BeanDefinitionRegistryPostProcessor
        List<BeanDefinitionRegistryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
            for (String ppName : postProcessorNames) {
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }
        sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
        registryPostProcessors.addAll(priorityOrderedPostProcessors);
        invokeBeanDefinitionRegistryPostProcessors(priorityOrderedPostProcessors, registry);

        //執(zhí)行implement了Ordered 的 BeanDefinitionRegistryPostProcessor
        postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
        List<BeanDefinitionRegistryPostProcessor> orderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
        for (String ppName : postProcessorNames) {
            if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                orderedPostProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                processedBeans.add(ppName);
            }
        }
        sortPostProcessors(beanFactory, orderedPostProcessors);
            registryPostProcessors.addAll(orderedPostProcessors);
        invokeBeanDefinitionRegistryPostProcessors(orderedPostProcessors, registry);
            ... 
            //執(zhí)行常規(guī)的BeanDefinitionRegistryPostProcessor 和BeanPostProcessor
         invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
         invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    }

    //同樣按照PriorityOrdered->Ordered->normal   的順序 執(zhí)行非BeanDefinitionRegistryPostProcessor 的BeanFactoryPostProcessor 的方法。
    .... 省略...
}

2. ConfigurationClassPostProcessor

在創(chuàng)建BeanFactory時(shí),spring默認(rèn)添加了ConfigurationClassPostProcessor。


ConfigurationClassPostProcessor

ConfigurationClassPostProcessor implement 了BeanDefinitionRegistryPostProcessor 和 PriorityOrdered 接口,于是在 invokeBeanFactoryPostProcessors方法調(diào)用的過(guò)程中,會(huì)調(diào)用ConfigurationClassPostProcessor 的 postProcessBeanDefinitionRegistry, 進(jìn)而在容器中注入新的類(lèi):ImportAwareBeanPostProcessor,EnhancedConfigurationBeanPostProcessor:

@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
      ...
      RootBeanDefinition iabpp = new RootBeanDefinition(ImportAwareBeanPostProcessor.class);
      iabpp.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
      registry.registerBeanDefinition(IMPORT_AWARE_PROCESSOR_BEAN_NAME, iabpp);
      RootBeanDefinition ecbpp = new RootBeanDefinition(EnhancedConfigurationBeanPostProcessor.class);
      ecbpp.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
      registry.registerBeanDefinition(ENHANCED_CONFIGURATION_PROCESSOR_BEAN_NAME, ecbpp);
      ...
      // 注入MainConfig類(lèi)中用@Bean注解的類(lèi)到容器中
      processConfigBeanDefinitions(registry);
}
  • processConfigBeanDefinitions
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
        ...
        // Read the model and create bean definitions based on its content
    if (this.reader == null) {
        this.reader = new ConfigurationClassBeanDefinitionReader(
        registry, this.sourceExtractor, this.resourceLoader, this.environment,
        this.importBeanNameGenerator, parser.getImportRegistry());
    }
    this.reader.loadBeanDefinitions(configClasses);
}
  • loadBeanDefinitionsForConfigurationClass: 在容器中注入MainConfig中通過(guò)@Bean,@Import,以及ImportBeanDefinitionRegistrars 方式添加的類(lèi)。
private void loadBeanDefinitionsForConfigurationClass(ConfigurationClass configClass,
            TrackedConditionEvaluator trackedConditionEvaluator) {

        if (trackedConditionEvaluator.shouldSkip(configClass)) {
            String beanName = configClass.getBeanName();
            if (StringUtils.hasLength(beanName) && this.registry.containsBeanDefinition(beanName)) {
                this.registry.removeBeanDefinition(beanName);
            }
            this.importRegistry.removeImportingClassFor(configClass.getMetadata().getClassName());
            return;
        }
           
        if (configClass.isImported()) {
            registerBeanDefinitionForImportedConfigurationClass(configClass);
        }
        for (BeanMethod beanMethod : configClass.getBeanMethods()) {
            loadBeanDefinitionsForBeanMethod(beanMethod);
        }
        loadBeanDefinitionsFromImportedResources(configClass.getImportedResources());
        loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 父子關(guān)系是很不好相處的。想起一個(gè)笑話,說(shuō)我們打電話回家都是打給媽?zhuān)谴虿煌ú糯蚪o爸爸,然后第一句話問(wèn)的還是“爸,...
    黑小生閱讀 286評(píng)論 7 5
  • 青磚黛瓦氤氳的煙雨舊夢(mèng),一紙油傘牽引的愛(ài)恨情仇,多少文人墨客為之怦然心動(dòng):錢(qián)塘江心的一點(diǎn)緋紅,千年古剎的佛理生香,...
    奏世華章閱讀 1,375評(píng)論 0 3
  • 以下場(chǎng)景是否熟悉? 在公司的工作交流群上斗表情圖: 開(kāi)發(fā)人員和測(cè)試人員承擔(dān)的是軟件工程中兩個(gè)不同方面的工作,一個(gè)是...
    Joey_GZ閱讀 2,518評(píng)論 3 7
  • 近幾年有個(gè)流行的詞叫“懶癌”,是比喻一個(gè)人懶到不可救藥。不是嚇唬你,太懶真的可能會(huì)引發(fā)癌癥、糖尿病、心腦血管疾病等...
    百合青春閱讀 298評(píng)論 0 1
  • 不想借錢(qián),心太累了,等到還錢(qián)的時(shí)候就知道多么痛苦了

友情鏈接更多精彩內(nèi)容