美文网首页spring 相关
Spring容器(四): BeanFactoryPostProc

Spring容器(四): BeanFactoryPostProc

作者: aix91 | 来源:发表于2019-01-13 15:45 被阅读0次

在创建、准备BeanFactory环境的流程结束后,在invokeBeanFactoryPostProcessors方法中,spring开始查找项目中定义的BeanFactoryPostProcessor,按照PriorityOrdered->Ordered->normal 顺序调用BeanFactoryPostProcessor的方法,为容器注入新的类:比如BeanPostProcessor(并没有初始化,只是保存了类名)。

1. invokeBeanFactoryPostProcessors 方法

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

    if (beanFactory instanceof BeanDefinitionRegistry) {
        ...
        //找到BeanFactory创建之初,spring默认添加的ConfigurationClassPostProcessor
       String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);

        //优先执行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);

        //执行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);
            ... 
            //执行常规的BeanDefinitionRegistryPostProcessor 和BeanPostProcessor
         invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
         invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
    }

    //同样按照PriorityOrdered->Ordered->normal   的顺序 执行非BeanDefinitionRegistryPostProcessor 的BeanFactoryPostProcessor 的方法。
    .... 省略...
}

2. ConfigurationClassPostProcessor

在创建BeanFactory时,spring默认添加了ConfigurationClassPostProcessor。


ConfigurationClassPostProcessor

ConfigurationClassPostProcessor implement 了BeanDefinitionRegistryPostProcessor 和 PriorityOrdered 接口,于是在 invokeBeanFactoryPostProcessors方法调用的过程中,会调用ConfigurationClassPostProcessor 的 postProcessBeanDefinitionRegistry, 进而在容器中注入新的类: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类中用@Bean注解的类到容器中
      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中通过@Bean,@Import,以及ImportBeanDefinitionRegistrars 方式添加的类。
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());
    }

相关文章

  • Spring容器(四): BeanFactoryPostProc

    在创建、准备BeanFactory环境的流程结束后,在invokeBeanFactoryPostProcessor...

  • Spring Boot 自动装配原理

    Spring boot 自动装配实现机制 一种猜测使用了 spring 的 beanFactoryPostProc...

  • Spring原理简述

    一、什么是Spring容器? Spring容器,也称Spring Ioc容器或bean容器,是Spring框架的核...

  • Spring 学习笔记(二):Spring 容器以及 bean

    Spring 容器 在 Spring 应用中,应用对象生存于 Spring 容器中,Spring 容器负责创建对象...

  • 2.Spring IoC 容器

    1.Spring IoC 容器 IoC 容器 Spring 容器是 Spring 框架的核心。容器将创建对象,把它...

  • spring原理机制

    1,关于spring容器: Spring的核心是spring容器,该容器负责管理spring中的java组件。 A...

  • Spring入门笔记

    Spring入门使用Spring容器Spring容器使用ApplicationContextApplication...

  • spring 学习02

    Spring 容器 在Spring 应用中,你的应用对象生存在Spring容器中,Spring 容器负责创建对象,...

  • spring详解(一)

    一:spring的基本用法: 1.关于spring容器: spring容器是Spring的核心,该 容器负责管理s...

  • 2018-05-12

    spring源码分析(四) 目录五、spring源码分析--5.5、IOC 容器的高级特性----1、介绍----...

网友评论

    本文标题:Spring容器(四): BeanFactoryPostProc

    本文链接:https://www.haomeiwen.com/subject/sptldqtx.html