Spring核心IOC源码解读(三)实现BeanFactoryPostProcessors接口的postProcessBeanFactory方法

   AbstractApplicationContext.invokeBeanFactoryPostProcessors() 代码块中,让 PostProcessorRegistrationDelegate 类去执行实现 postProcessBeanFactory() 方法的逻辑👇

    protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        //具体的执行逻辑在这个方法中
        PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

        // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
        // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
        if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }
    }

   PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); 这个方法有两个大逻辑,两个大逻辑的内部又分别有三个类似的小逻辑。两个大逻辑分别处理 BeanDefinitionRegistryPostProcessor 接口和 BeanFactoryPostProcessor 接口的实现。三个小逻辑依次处理 PriorityOrdered 接口、 Ordered 接口、 无Order实现 的实现。

  这个方法特别长,有130多行,一步一步拆开来看。

一、第一部分,先引用 BeanDefinitionRegistryPostProcessor 的实现

  先看看 BeanDefinitionRegistryPostProcessor 的类结构👇,它继承了 BeanFactoryPostProcessor 接口

   它的方法说明:在基本的初始化后,编辑容器内部的BeanDefinitionResgistry,此时BeanDefinition已经加载了,但还没有初始化好。此时允许添加更多的BeanDefinition。

(1)PriorityOrdered优先处理

            List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

            // (1)筛选PriorityOrdered实现
            String[] postProcessorNames =
                    beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            for (String ppName : postProcessorNames) {
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }
            //(2)根据Order值大小排序
            sortPostProcessors(currentRegistryProcessors, beanFactory);
            //(3)registryProcessors最后处理postProcessBeanFactory()
            registryProcessors.addAll(currentRegistryProcessors);
            //(4)核心:处理postProcessBeanDefinitionRegistry()方法的调用
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
            currentRegistryProcessors.clear();

(2)Ordered次优先

  第二步和第一步的代码非常相似,就是 PriorityOrdered 替换为了 Ordered ,并且对第一步已经执行过 postProcessBeanDefinitionRegistry() 方法的进行了去重

(3)无实现最后处理

  第三步,把第一步和第三部执行后剩下的 BeanDefinitionRegistryPostProcessor 进行执行。

(4)执行 BeanDefinitionRegistryPostProcessor 的 postProcessBeanFactory() 实现

            // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
            invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
            invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);

  可以在第(1)步中第(3)步看到,registryProcessors最后处理postProcessBeanFactory()。这一步就是将 BeanDefinitionRegistryPostProcessor 对象添加到 registryProcessors 集合中最后一起执行 postProcessBeanFactory() 。

二、第二部分, BeanFactoryPostProcessor 的实现

  和上面第一部分中的(1)(2)(3)步类似,也是去根据Order进行依次排序执行,不过都是直接执行 postProcessBeanFactory() 

总结:

  这一步Spring主要为了实现 postProcessBeanFactory() 方法,先根据顺序实现 postProcessBeanDefinitionRegistry() ,再实现 BeanDefinitionRegistryPostProcessor 的 postProcessBeanFactory() ;最后根据顺序实现 BeanFactoryPostProcessor 的 postProcessBeanFactory() 

posted on 2020-09-25 16:03  lyjlyjlyj  阅读(239)  评论(0编辑  收藏  举报

导航