Spring源码之invokeBeanFactoryPostProcessors()

invokeBeanFactoryPostProcessors概述

一般情况下:
执行到这个方法的beanFactory的beanDefinitionMap中有6个BeanDefinition,5个基础BeanDefinition+AppConfig的 BeanDefinition
而这6个中只有一个BeanFactoryPostProcessor:ConfigurationClassPostProcessor
这里会执行ConfigurationClassPostProcessor进行@Component的扫描,扫描得到BeanDefinition,并注册到beanFactory中
注意:扫描的过程中可能又会扫描出其他的BeanFactoryPostProcessor,那么这些BeanFactoryPostProcessor也得在这一步执行

BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;

					registryProcessor.postProcessBeanDefinitionRegistry(registry);

					registryProcessors.add(registryProcessor);
				}
				else {
					regularPostProcessors.add(postProcessor);
				}

在这个方法的第一步其实用来处理调用API(addBeanFactoryPostProcessor)添加的beanFactory后置处理器
默认情况下这里一个购置处理器都不会有,但是如果程序员调用API进行了添加,这里就会执行
BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(BeanDefinitionRegistry),
并且这个方法还传入了一个参数BeanDefinitionRegistry 就说明,这个方法可以进行BeanDefinitiojn的注册

List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
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);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();

这里一般情况下只会扫描到一个后置处理器 internalConfigurationAnnotationProcessor ,其实际的类型为 ConfigruationClassPostProcessor,并且这个后置处理器,关于这个后置处理器做了什么事情,笔者会在单独进行讲解
总的来说这里要做的事情就是调用容器中实现了PriorityOrdered的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry

postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();

这一阶段类似于上一阶段,是调用 容器中实现恶劣Ordered接口的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry
但是这里有一个关键点!processedBeans.contains(ppName),processedBeans这个集合里面装的是已经执行过的后置处理器,也就是说
这里不会重复执行之前执行过的后置处理器

boolean reiterate = true;
		
			while (reiterate) {
				reiterate = false;
				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
					if (!processedBeans.contains(ppName)) {
						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
						processedBeans.add(ppName);
						reiterate = true;
					}
				}
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				registryProcessors.addAll(currentRegistryProcessors);
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
				currentRegistryProcessors.clear();
			}
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);

最后一步执行的就是普通的BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry,同样需要将执行过的后置处理器排除在外
这里使用到了一个while循环,从代码层面来看,循环的终止条件是没有找到 需要执行的BeanDefinitionRegistryPostProcessor的时候,就会跳出循环,为什么要这么处理?
因为我们在执行当前的 后置处理器的时候,这个后置处理器可能会添加新的后置处理器,为了保证新的后置处理器的执行,就要进行这种迭代的调用

以上是对BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry方法进行回调的流程
而接下来就是 对BeanFactoryPostProcessor的postProcessBeanFactory 进行回调
同样的是先执行实现了PriorityOrdered接口的,再执行Order接口的,最后执行普通的后置处理器,这里就不做过多的分析了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值