【Spring源代码阅读之八】调用registerBeanPostProcessors()方法将容器中的BeanPostProcessor提取出来注册进容器的集合中供对Bean创建时调用

调用registerBeanPostProcessors方法将容器中的BeanPostProcessor提取出来注册进容器的集合中供对Bean创建时调用

导图

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

AbstractApplicationContext#registerBeanPostProcessors

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

PostProcessorRegistrationDelegate#registerBeanPostProcessors()

/**
 * 向BeanFactory中注册BeanPostProcessor
 */
public static void registerBeanPostProcessors(
		ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

	/**
	 * 获取BeanFactory中所有实现了BeanPostProcessor接口的BeanName
	 */
	String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

	// Register BeanPostProcessorChecker that logs an info message when
	// a bean is created during BeanPostProcessor instantiation, i.e. when
	// a bean is not eligible for getting processed by all BeanPostProcessors.
	/**
	 * 获取容器中应该存在多少BeanPostProcessor
	 * 数量为已经注册的 + 下面一行注册的一个 + 从BeanDefinition的map中拿出来的
	 */
	int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
	/**
	 * 注册一个BeanPostProcessor
	 * 根据注释:注册BeanPostProcessorChecker,当bean在BeanPostProcessor实例化期间创建时,即当bean不符合所有
	 * BeanPostProcessor处理的条件时,记录信息消息。
	 * 不理解其中的含义
	 */
	beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

	// Separate between BeanPostProcessors that implement PriorityOrdered,
	// Ordered, and the rest.
	/**
	 * 存放实现了PriorityOrdered接口的BeanPostProcessor实例
	 */
	List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
	/**
	 * 存放实现了MergedBeanDefinitionPostProcessor接口的BeanPostProcessor实例
	 */
	List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
	/**
	 * 存放实现了Ordered接口的BeanPostProcessor实例
	 */
	List<String> orderedPostProcessorNames = new ArrayList<>();
	/**
	 * 存放剩余的BeanPostProcessor实例
	 */
	List<String> nonOrderedPostProcessorNames = new ArrayList<>();

	/**
	 * 遍历实现了BeanPostProcessor接口的BeanName
	 */
	for (String ppName : postProcessorNames) {
		/**
		 * 实现了PriorityOrdered接口的话就获取实例存放到集合中
		 * 如果实例实现了MergedBeanDefinitionPostProcessor中存放到相应的集合中
		 */
		if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			priorityOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		/**
		 * 实现了Ordered接口的话就将BeanName存放到相应集合中
		 */
		else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}
		/**
		 * 没有实现任何排序接口的话就将BeanName存放到相应集合中
		 */
		else {
			nonOrderedPostProcessorNames.add(ppName);
		}
	}

	// First, register the BeanPostProcessors that implement PriorityOrdered.
	/**
	 * 对实现了BeanPostProcessor接口和PriorityOrdered接口的实例进行排序
	 * 然后注册进容器中
	 */
	sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

	/**
	 * 遍历实现了BeanPostProcessor接口和Ordered接口的BeanName
	 * 获取其实例添加到相应的集合中,如果实现了MergedBeanDefinitionPostProcessor中存放到相应的集合中
	 * 然后排序注册进容器中
	 */
	// Next, register the BeanPostProcessors that implement Ordered.
	List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
	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);

	/**
	 * 遍历剩余实现了BeanPostProcessor接口BeanName
	 * 获取其实例添加到相应的集合中,如果实现了MergedBeanDefinitionPostProcessor中存放到相应的集合中
	 * 然后注册进容器中
	 */
	// Now, register all regular BeanPostProcessors.
	List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
	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接口的BeanPostProcessor
	 * 然后注册进容器中
	 */
	// Finally, re-register all internal BeanPostProcessors.
	sortPostProcessors(internalPostProcessors, beanFactory);
	registerBeanPostProcessors(beanFactory, internalPostProcessors);

	// Re-register post-processor for detecting inner beans as ApplicationListeners,
	// moving it to the end of the processor chain (for picking up proxies etc).
	/**
	 * 注册一个程序侦听器
	 */
	beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}

registerBeanPostProcessors

private static void registerBeanPostProcessors(
		ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {

	for (BeanPostProcessor postProcessor : postProcessors) {
		beanFactory.addBeanPostProcessor(postProcessor);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值