栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring源码分析 (bean后置处理器的创建过程 + 注册监听器) (十三)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring源码分析 (bean后置处理器的创建过程 + 注册监听器) (十三)

文章目录
      • 1.bean后置处理器的创建过程
      • 2.注册监听器部分/Spring如何按照类型找到组件
        • 2.1 注册监听器
        • 2.2 Spring如何按照类型找到组件

1.bean后置处理器的创建过程

refresh()

registerBeanPostProcessors()

PostProcessorRegistrationDelegate: 这个类是管理全部的后置处理器的类

	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.
		List priorityOrderedPostProcessors = new ArrayList<>();
		List internalPostProcessors = new ArrayList<>();
		List orderedPostProcessorNames = new ArrayList<>();
		List 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);
			}
		}

		// First, register the BeanPostProcessors that implement PriorityOrdered.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

		// Next, register the BeanPostProcessors that implement Ordered.
		List 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);

		// Now, register all regular BeanPostProcessors.
		List 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.
		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));
	}

注册BeanPostProcessor: 就是将BeanPostProcessor放入一个存放后置处理器的List, beanPostProcessors


首先注册实现了PriorityOrdered的BeanPostProcessors
其次注册实现了Ordered的BeanPostProcessors
然后注册常规的BeanPostProcessors
最后重新注册内部的BeanPostProcessors

然后重写注册用于将内部 bean 检测为 ApplicationListeners 的后处理器, 将其移动到处理器链的末端, 用于接代理等。


我们自己写的后置处理器是在PostProcessorRegistrationDelegate中
其他的后置处理器是内部的后置处理器, 如果是内部的话会在最后有一步会注册进List中。

2.注册监听器部分/Spring如何按照类型找到组件 2.1 注册监听器

refresh() -> registerListeners()


通过SmartInstantiationAwareBeanPostProcessor的predictBeanType 判断类型, 可以在组件创建前改变类型。

2.2 Spring如何按照类型找到组件




doGetBeanNamesForType()


是否类型匹配

通过Bean的名称获取到BeanDefinition, 然后判断这个组件是否是我们想要的类型

这个Bean的名称在beanDefinitionNames中
BeanDefinitionMap中放BeanDefinition

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/865613.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号