专栏首页浪人聊编程PostProcessorRegistrationDelegate 源码分析 原

PostProcessorRegistrationDelegate 源码分析 原

1 PostProcessorRegistrationDelegate 类简介

PostProcessorRegistrationDelegate 是一个静态工具类,包访问权限,AbstractApplicationContext's post-processor handling 的委托.把BeanFactoryPostProcessor获取与执行 以及BeanPostProcessor的注册.

2 核心方法分析

2.1 registerBeanPostProcessors 方法分析

public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {

		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.
		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<BeanPostProcessor>();
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
                //使用Ordered保证顺序
		List<String> orderedPostProcessorNames = new ArrayList<String>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
		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);
			}
		}

		// First, register the BeanPostProcessors that implement PriorityOrdered.
                //第一步,注册所有实现PriorityOrdered的BeanPostProcessor
		sortPostProcessors(beanFactory, priorityOrderedPostProcessors);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// Next, register the BeanPostProcessors that implement Ordered.
                //第二部注册所有实现ordered接口
		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
		for (String ppName : orderedPostProcessorNames) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		sortPostProcessors(beanFactory, orderedPostProcessors);
		registerBeanPostProcessors(beanFactory, orderedPostProcessors);

		// Now, register all regular BeanPostProcessors.
                //第三步注册所有无序的BeanPostProcessor
		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
		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.
                //第四步注册所有MergedBeanDefinitionPostProcessor类型的BeanPostProcessor
		sortPostProcessors(beanFactory, internalPostProcessors);
		registerBeanPostProcessors(beanFactory, internalPostProcessors);
                //添加ApplicationListener 探测器
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
	}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • AbstractApplicationContext源码分析

    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite...

    东营浪人
  • tomcat nio源码分析

    1 NioEndpoint.Acceptor等待客户端连接,客户端连接之后将SocketChannel转发给Poller

    东营浪人
  • BeanDefinitionParserDelegate 分析

    东营浪人
  • Spring扩展点之BeanPostProcessor

    BeanPostProcessor接口是Spring中一个非常重要的接口,它的接口定义如下

    Java学习录
  • 数据分析与数据挖掘 - 09邻近算法

    邻近算法又叫做K临近算法或者KNN(K-NearestNeighbor),是机器学习中非常重要的一个算法,but它简单得一塌糊涂,其核心思想就是样本的类别由距离...

    马一特
  • Nacos配置服务原理

    在了解NACOS客户端配置之前,我们先看看spring boot怎么样加载远程配置的。spring boot提供了加载远程配置的扩展接口 PropertySou...

    GreizLiao
  • 手把手教你学Numpy——常用API合集

    在日常的工作当中,我们经常需要通过一系列值来了解特征的分布情况。比较常用的有均值、方差、标准差、百分位数等等。前面几个都比较好理解,简单介绍一下这个百分位数,它...

    TechFlow-承志
  • Android应用防止so注入防止动态调试参考代码

    由于公司应用需要过安全测试,测试那边说有so注入漏洞,所以找到了这份代码,并成功通过测试。

    用户1696846
  • 动手开发一个名为“微天气”的微信小程序(下)

    由于在index.js中还没有设置初始化数据,所以在界面中看不到具体的数据,从而也导致界面的效果没达到设置的要求。

    博文视点Broadview
  • 易企秀前端压缩源码分析与还原

    你是否想知道易企秀炫酷的H5是如何实现的,原理是什么,本文会为你揭秘并还原压缩过的源代码。 易企秀是一款h5页面制作工具,因方便易用成为业界标杆。后续一个项目会...

    用户1177380

扫码关注云+社区

领取腾讯云代金券