【spring学习笔记 四】registerBeanPostProcessors()


上一篇我们聊完了注册与唤醒BeanFactoryPostProcessor,这篇我们就来聊聊BeanPostProcessor的注册 。

registerBeanPostProcessors()

第一步:添加BeanPostProcessorChecker

创建BeanPostProcessorChecker有两个参数一个beanFactory,一个就是count。
而这个count就代表了当前环境中应该有BeanPostProcessor个数。

BeanPostProcessorChecker作用就是记录加载的BenPostProcessor的日志。 比较简单

		//找到beanFactory中所有的BeanPostProcessor名称
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
		//已存在的BeanPostProcessor个数+自己+注册的BeanPostProcessor
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

第二步:对BeanPostProcessor的实现类进行排序

也就是上一张针对BeanFactoryPostProcessor排序一样,不过这里还有点特殊的地方。

		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();//优先队列
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();//新增一个,主要处理Bean内部的一些情况(@Value,@AutoWrite类似的)
		List<String> orderedPostProcessorNames = new ArrayList<>(); //排序队列
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();//普通队列
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

这里可以看到分为了4个集合,分别是:

  1. 实现了PriorityOrdered的优先队列
  2. 实现了MergedBeanDefinitionPostProcessor的bean定义合并队列
  3. 实现了Ordered的排序队列
  4. 什么都没有的普通队列

注册顺序分别为 1,3,4 。
这里细心的同学可能已经发现了,上面的代码中只有满足PriorityOrdered的条件才会判断MergedBeanDefinitionPostProcessor。那么是不是意味着必须要实现PriorityOrdered呢?
答案当然是否定的,在后面处理其它两类队列的时候会进行判断。这样在MergedBeanDefinitionPostProcessor维度也有了顺序。

第三步:注册优先队列

		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); 

第四步:注册排序队列

		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String ppName : orderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, orderedPostProcessors); 

第五步:注册普通队列

		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String ppName : nonOrderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			nonOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

第六步:注册实现了MergedBeanDefinitionPostProcessor的队列

		sortPostProcessors(internalPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, internalPostProcessors);

第七步:注册ApplicationListenerDetector

		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));

ApplicationListenerDetector这个类的作用就是找出所有Bean中实现了ApplicationListener的单例,并将其放入容器的Listener集合中。这也是自定义Listener的第二种方法(不过这一类的Listener对于比较靠前的事件是监听不到的)。

MergedBeanDefinitionPostProcessor

MergedBeanDefinitionPostProcessor是一种继承BeanPostProcessor的特殊扩展点。

它赋予了开发者在创建Bean之前对Bean的创建模板进行一定的修改。

比如说大家比较熟悉的@Autowrited 自动装配这个注解。
它的处理类AutowiredAnnotationBeanPostProcessor就实现了 MergedBeanDefinitionPostProcessor 。
主要的作用就是将那些需要被装配的属性放入BeanDefinition供后续填充的时候使用(填充会在后面的章节getBean中详细讲解)。

还有一个就是@Resource 这个注解
它的处理CommonAnnotationBeanPostProcessor处理的思路跟上面的是基本相同的。

其它的我就不一一列举了,只要是跟Bean创建过程中属性或方法的填充,解决方案多半都与MergedBeanDefinitionPostProcessor 有关。

总结

我们接下来总结下注册BeanPostProcessor的流程

  1. 添加一个日志记录处理器
  2. 将BeanPostProcess进行排序
  3. 按照顺序注册BeanPostOProcessor
  4. 添加一个处理ApplicationListener的处理器
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐芬奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值