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()