Spring 中 BeanFactoryPostProcessor的加载

最近看到,大部分文章都是在讲BeanFactoryPostProcessor的使用,而对其加载过程闭口不谈,

一句在invokeBeanFactoryPostProcessors(beanFactory) 中调用了全部的BeanFactoryPostProcessor就结束了

但是其实有没有考虑过一点,refresh方法中,进行到invokeBeanFactoryPostProcessor的时候,除了在 obtainFreshBeanFactory读取的Bean以外,实际上还没有进行任何Bean的加载,那这里是在哪里加载的呢


先直接说结论,通过debug,发现Spring由系统在prepareBeanFactory(beanFactory)先行内置了BeanFactoryPostProcessor,最后通过org.springframework.context.annotation.ConfigurationClassParser读取的BeanFactoryPostProcessor,将@Component 修饰的 BeanFactoryPostProcessor加载进入容器


invokeBeanFactoryPostProcessors,其中getBeanFactoryPostProcessors返回如下

image.png

之后,在第一次获取到的ProcessorNames的代码及得到的对象如下

// 根据类型读取,得到`org.springframework.context.annotation.internalConfigurationAnnotationProcessor`
            String[] postProcessorNames =
                    beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            for (String ppName : postProcessorNames) {
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    // 获取的为 ConfigurationClassPostProcessor
                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }

此处的 ConfigurationClassPostProcessor,进行了@Configuration@Bean的处理,

之后,我们可以在ConfigurationClassParser中发现具体的加载BeanFactoryPostProcessor的位置,如下图所示

image.png

最后,在invokeBeanFactoryPostProcessors(beanFactory)的最后,从容器中取出所有剩余的BeanFactoryPostProcessor的类,进行处理

image.png

你可能感兴趣的:(Spring 中 BeanFactoryPostProcessor的加载)