Spring【版本5.2.2】容器初始化过程(四)refresh(三)

本文详细解析了Spring框架中BeanPostProcessor的注册过程,包括按PriorityOrdered和Ordered接口进行分组排序,以及如何处理CommonAnnotationBeanPostProcessor和AutowiredAnnotationBeanPostProcessor。同时介绍了注册BeanPostProcessorChecker和ApplicationListenerDetector的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6.registerBeanPostProcessors

这个方法主要是处理各种各样的BeanPostProcessors,并按照实现接口PriorityOrdered和Ordered进行分组排序

public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
		// 从容器初始化的5大bd中找到实现了BeanPostProcessor接口的类,
		// 总共有两个AutowiredAnnotationBeanPostProcessor,和CommonAnnotationBeanPostProcessor
		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.
		// [注册一个BeanPostProcessorChecker,
		// 当一个bean在BeanPostProcessor实例化过程中被创建时,
		// 也就是当一个bean没有资格被所有BeanPostProcessor处理时, 添加一条消息]
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

		// Separate between BeanPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest. 按照PriorityOrdered分组
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		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);
			}
		}

		// 1. 先添加实现了PriorityOrdered的BeanPostPorcessors
  	// 添加两个实现了PriorityOrdered的BeanPostPorcessors到beanPostProcessors中
  	// CommonAnnotationBeanPostProcessor和AutowiredAnnotationBeanPostProcessor
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// 2. 先添加实现了Ordered的BeanPostPorcessors
		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);

		// 3. 添加剩下的BeanPostProcessors
		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);

		// Finally, re-register all internal BeanPostProcessors.
		// 这里重新注册所有内部的BeanPostProcessors,why?暂时不明白
		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).
		// 单独注册一个实现了PostProcessor的ApplicationListenerDetector类,
  	// 添加到processor chain的最后,在后面的代理里面会用到
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

说明:
internalAutowiredAnnotationProcessor和internalCommonAnnotationProcessor 的加载是在
AnnotationConfigApplicationContext执行构造函数时候,在初始化AnnotatedBeanDefinitionReader的时候,
通过一下stacktrace添加到spring容器的。主要的代码:

AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
7. initMessageSource

主要是处理国际化相关的。

			// Use empty MessageSource to be able to accept getMessage calls.
			DelegatingMessageSource dms = new DelegatingMessageSource();
			dms.setParentMessageSource(getInternalParentMessageSource());
			this.messageSource = dms;
			// 注册一个BeanName为messageSource,BeanType为DelegatingMessageSource的bean
			beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
			if (logger.isTraceEnabled()) {
				logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");
			}
8. initApplicationEventMulticaster

初始化ApplicationEventMulticaster,如果没有,则使用SimpleApplicationEventMulticaster

9. onRefresh

初始化特定上下文子类中的其他特殊bean。当前的测试类,没有具体的执行

10.registerListeners

添加将ApplicationListener实现为侦听器的bean。不影响其他监听器,可以在不添加bean的情况下添加。
本例子中没有,暂时过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值