spring 源码注册BPP-registerBeanPostProcessors

上篇传送门
前两篇咱们了解了component-scan和其他一些注解的解析成bean定义信息的过程,前者是通过XML的方式loadBeanDefinition,后者通过ConfigurationClassPostProcessor来实现,那么这时候,bean的定义信息基本上算是完成了,接下来进行注册BPP

BPP就是用来拦截bean的创建,在初始化前后进行增强,具体细节咱们后面会详聊

  1. 获取所有BPP的bean名称
  2. 创建一个BeanPostProcessorChecker
  3. 遍历BPP名称
  4. 分组并实例化
  5. 注册

流程图
在这里插入图片描述

源码

public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
	// 获取所有的bean名称(这里是从bean定义信息中获取)
	String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
	// 创建一个BeanPostProcessorChecker,并给赋值BPP的数量
	int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
	beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
	// 实现了priorityOrdered的BPP对象
	List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
	// 内部的BPP对象
	List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
	// 实现了Order的BPP名称
	List<String> orderedPostProcessorNames = new ArrayList<>();
	// 普通的BPP名称
	List<String> nonOrderedPostProcessorNames = new ArrayList<>();
	for (String ppName : postProcessorNames) {
		//是否实现了PriorityOrdered
		if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			// 创建实例
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			// 添加到集合中
			priorityOrderedPostProcessors.add(pp);
			// 如果属于MergedBeanDefinitionPostProcessor代表是内部的BPP
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				// 添加到内部的BPP集合中
				internalPostProcessors.add(pp);
			}
		}
		// 如果实现了Order接口,添加到ordered结合中
		else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}else {
			// 其他的是普通的BPP
			nonOrderedPostProcessorNames.add(ppName);
		}
	}
	// 排序
	sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	//先注册实现了priorityOrdered接口的BPP
	registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
	// 存储实现了ordered接口的BPP
	List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
	for (String ppName : orderedPostProcessorNames) {
		// 实例化实现了Order接口的BPP
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		// 添加到失恋了ordered集合
		orderedPostProcessors.add(pp);
		// 如果实现了MergedBeanDefinitionPostProcessor代表是内部的BPP
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	// 对实现了order接口的BPP进行排序
	sortPostProcessors(orderedPostProcessors, beanFactory);
	// 注册实现了order接口的BPP
	registerBeanPostProcessors(beanFactory, orderedPostProcessors);
	// 创建普通BPP容器
	List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
	for (String ppName : nonOrderedPostProcessorNames) {
		// 实例化普通的BPP
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		// 添加到容器
		nonOrderedPostProcessors.add(pp);
		// 如果实现了MergedBeanDefinitionPostProcessor代表是内部BPP
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	// 注册普通的BPP
	registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
	// 对内部的BPP进行排序
	sortPostProcessors(internalPostProcessors, beanFactory);
	// 注册内部的BPP
	registerBeanPostProcessors(beanFactory, internalPostProcessors);
	// 最后注册Spring应用的探测器
	beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值