Spring源码解析--refresh()--invokeBeanFactoryPostProcessor()

Spring源码解析–refresh()–invokeBeanFactoryPostProcessor()

final class PostProcessorRegistrationDelegate {
    
    public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
		//processedBeans用于存储已经执行过的BeanFactoryPostProcessor,避免重复执行
		Set<String> processedBeans = new HashSet<>();
		//默认的beanFactory为DefaultListableBeanFactory,而DefaultListableBeanFactory实现了BeanDefinitionRegistry接口,所以此处条件成立
		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
            //存储非BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProcessor实例,用于后续执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
            //存储BeanDefinitionRegistryPostProcessor实例,用于后续执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
			//处理外部定义的BeanFactoryPostProcessor,将BeanDefinitionRegistryPostProcessor与BeanFactoryPostProcessor区分开
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
                //BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProcessor
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
                    //执行postProcessBeanDefinitionRegistry()进行一些特殊BeanDefinition的注册
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					registryProcessors.add(registryProcessor);
				}
				else {
                    //存储非BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProcessor实例
					regularPostProcessors.add(postProcessor);
				}
			}
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
            //获取之前在bean工厂中注册的BeanDefinitionRegistryPostProcessor实例,SpringBoot默认情况下这里只有ConfigurationClassPostProcessor这唯一一个
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
                //先执行实现了PriorityOrdered(实现了Ordered接口的在下面而不是这里执行)的BeanDefinitionRegistryPostProcessor
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    //放入currentRegistryProcessors,待后面排序好后再执行
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    //提前放入processedBeans防止重复执行,但是此时尚未执行,因为要按照PriorityOrdered排好序后再执行
					processedBeans.add(ppName);
				}
			}
            
            //对添加进currentRegistryProcessors的BeanDefinitionRegistryPostProcessor按照PriOrityOrdered进行排序
			sortPostProcessors(currentRegistryProcessors, beanFactory);
            //currentRegistryProcessors全部添加进registryProcessors中
			registryProcessors.addAll(currentRegistryProcessors);
            //遍历并执行currentRegistryProcessors中的实例的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()方法
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
            //currentRegistryProcessors没用了,清空它
			currentRegistryProcessors.clear();
            //获取之前在bean工厂中注册的BeanDefinitionRegistryPostProcessor实例,SpringBoot默认情况下这里还是只有ConfigurationClassPostProcessor这唯一一个
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
                //判断之前是否已经执行过(防止上面实现了PriorityOrdered接口的重复执行),执行实现了Ordered接口的BeanDefinitionRegistryPostProcessor
				if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    //提前放入processedBeans防止重复执行,但是此时尚未执行,因为要按照Ordered排好序后再执行
					processedBeans.add(ppName);
				}
			}
            
            //********
            //Question:为什么实现了Ordered和PriorityOrdered的类实例要分开执行?
            //Answer:因为Spring规定了PriorityOrdered优先级比Ordered要高
            //********
            //对添加进currentRegistryProcessors的BeanDefinitionRegistryPostProcessor按照Ordered进行排序
			sortPostProcessors(currentRegistryProcessors, beanFactory);
            //currentRegistryProcessors全部添加进registryProcessors中
			registryProcessors.addAll(currentRegistryProcessors);
            //遍历并执行currentRegistryProcessors中的实例的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()方法
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
            //currentRegistryProcessors没用了,清空它
			currentRegistryProcessors.clear();
			
            //********
            //Question:为什么处理没有用Ordered和PriorityOrdered接口的BeanDefinitionRegistryPostProcessor要用while一直循环下去呢?
            //Answer:因为防止执行过程中又有新的BeanDefinitionRegistryPostProcessor加入到了beanFactory中-----为什么会有后续又添加新的进去的情况,因为BeanDefinitionRegistryPostProcessor是允许新注册BeanDefinition的####postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
            //********
            //最后处理没有用Ordered和PriorityOrdered接口的BeanDefinitionRegistryPostProcessor
			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);
                        //由于有尚未执行的BeanDefinitionRegistryPostProcessor,所以后续执行该实例代码的接口代码的时候,有可能会心注册BeanDefinition,而这BeanDefinition有可能是BeanDefinitionRegistryPostProcessor类型的,所以此处reiterate重新赋值为true,开始新一轮while循环,直到下一次循环时beanFactory中没有新的BeanDefinitionRegistryPostProcessor,说明上一轮while循环中并没有注册新的BeanDefinitionRegistryPostProcessor的BeanDefinition,然后便可以跳出循环了。
						reiterate = true;
					}
				}
                //对添加进currentRegistryProcessors的BeanDefinitionRegistryPostProcessor排序
				sortPostProcessors(currentRegistryProcessors, beanFactory);
                //currentRegistryProcessors全部添加进registryProcessors中
				registryProcessors.addAll(currentRegistryProcessors);
                //遍历并执行currentRegistryProcessors中的实例的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry()方法
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
                //currentRegistryProcessors没用了,清空它
				currentRegistryProcessors.clear();
			}

			//执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

		else {
			//BeanFactory如果不归属于BeanDefinitionRegistry类型,则直接执行beanFactoryPostProcessor
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
		}

		//获取beanFactory中注册的非BeanDefinitionRegistryPostProcessor的BeanFactoryPostProcessor,用于后面调用
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {
            //之前已经执行过的直接跳过
			if (processedBeans.contains(ppName)) {
				// skip - already processed in first phase above
			}
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                //实现了PriorityOrdered接口的添加到priorityOrderedPostProcessors中
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                //实现了Ordered接口的添加到orderedPostProcessorNames中
				orderedPostProcessorNames.add(ppName);
			}
			else {
                //未实现排序接口的添加到nonOrderedPostProcessorNames中
				nonOrderedPostProcessorNames.add(ppName);
			}
		}
        //********
        //由于Spring规定PriorityOrdered优先级高于Ordered,所以PriorityOrdered先执行
        //********
		//对实现PriorityOrdered接口的BeanFactoryPostProcessor进行排序然后执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
        
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
        //对实现Ordered接口的BeanFactoryPostProcessor进行排序然后执行BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
		sortPostProcessors(orderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
        //执行未实现PriorityOrderd和Ordered接口的BeanFactoryPostProcessor.postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

		// Clear cached merged bean definitions since the post-processors might have
		// modified the original metadata, e.g. replacing placeholders in values...
		beanFactory.clearMetadataCache();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值