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

spring妗嗘灦婧愮爜(spring婧愮爜瑙h)

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

spring妗嗘灦婧愮爜(spring婧愮爜瑙h)

上篇传送门
前两篇咱们了解了component-scan和其他一些注解的解析成bean定义信息的过程,前者是通过XML的方式loadBeanDefinition,后者通过ConfigurationClassPostProcessor来实现,那么这时候,bean的定义信息基本上算是完成了,接下来进行注册BPP

BPP就是用来拦截bean的创建,在初始化前后进行增强,具体细节咱们后面会详聊

    获取所有BPP的bean名称创建一个BeanPostProcessorChecker遍历BPP名称分组并实例化注册

流程图

源码

public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
	// 获取所有的bean名称(这里是从bean定义信息中获取)
	String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
	// 创建一个BeanPostProcessorChecker,并给赋值BPP的数量
	int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
	beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
	// 实现了priorityOrdered的BPP对象
	List priorityOrderedPostProcessors = new ArrayList<>();
	// 内部的BPP对象
	List internalPostProcessors = new ArrayList<>();
	// 实现了Order的BPP名称
	List orderedPostProcessorNames = new ArrayList<>();
	// 普通的BPP名称
	List nonOrderedPostProcessorNames = new ArrayList<>();
	for (String ppName : postProcessorNames) {
		//是否实现了PriorityOrdered
		if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			// 创建实例
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			// 添加到集合中
			priorityOrderedPostProcessors.add(pp);
			// 如果属于MergedBeanDefinitionPostProcessor代表是内部的BPP
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				// 添加到内部的BPP集合中
				internalPostProcessors.add(pp);
			}
		}
		// 如果实现了Order接口,添加到ordered结合中
		else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}else {
			// 其他的是普通的BPP
			nonOrderedPostProcessorNames.add(ppName);
		}
	}
	// 排序
	sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	//先注册实现了priorityOrdered接口的BPP
	registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
	// 存储实现了ordered接口的BPP
	List orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
	for (String ppName : orderedPostProcessorNames) {
		// 实例化实现了Order接口的BPP
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		// 添加到失恋了ordered集合
		orderedPostProcessors.add(pp);
		// 如果实现了MergedBeanDefinitionPostProcessor代表是内部的BPP
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	// 对实现了order接口的BPP进行排序
	sortPostProcessors(orderedPostProcessors, beanFactory);
	// 注册实现了order接口的BPP
	registerBeanPostProcessors(beanFactory, orderedPostProcessors);
	// 创建普通BPP容器
	List nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
	for (String ppName : nonOrderedPostProcessorNames) {
		// 实例化普通的BPP
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		// 添加到容器
		nonOrderedPostProcessors.add(pp);
		// 如果实现了MergedBeanDefinitionPostProcessor代表是内部BPP
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	// 注册普通的BPP
	registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
	// 对内部的BPP进行排序
	sortPostProcessors(internalPostProcessors, beanFactory);
	// 注册内部的BPP
	registerBeanPostProcessors(beanFactory, internalPostProcessors);
	// 最后注册Spring应用的探测器
	beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/776211.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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