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

spring 源码执行BFPP invokeBeanFactoryPostProcessors (1)

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

spring 源码执行BFPP invokeBeanFactoryPostProcessors (1)

上篇传送门

上篇咱们了解了工厂创建,bean定义信息的加载,这篇咱们来探索下BFPP

BFPP大体了解

BFPP作用

    处理对Bean工厂扩展(继承)对注解支持解析对Bean定义信息扩展(BDRPP)对BFPP实现类处理并进行扩展对属性进行替换(配置文件,占位符)

源码之前先了解两个接口的作用

    BeanFactoryPostProcessor 对工厂进行增强(bean定义信息解析之后,bean实例化前)BeanPostProcessor 对bean的初始化前后进行增强

上面两个接口作用后咱们再看下两个接口的关系

    BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessorBeanDefinitionRegistryPostProcessor BDRPP实现了BFPPBeanDefinitionRegistryPostProcessor 是Bean定义信息的注册器,对Bean定义信息增删改操作

执行流程

咱们在这个方法中学到了什么

    对bean增强咱们可以使用BDRPP或BFPP获取缓存中对象getBeanNamesForType,还有另外类似的方法供咱们平常开发中使用(getBeansForType)责任链模式
AbstractApplicationContext.invokeBeanFactoryPostProcessors 执行BFPP 源码
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	//执行BFPP
	//getBeanFactoryPostProcessors() 外部的BFPP
	PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
	// 动态代理支持及织入支持
	// 处理 -javaagent:pathxxx.jar  处理成BPP
	if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
		beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
		beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
	}
}
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 执行BFPP
public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List beanFactoryPostProcessors) {

	// 记录已经处理过的BFPP
	Set processedBeans = new HashSet<>();

	if (beanFactory instanceof BeanDefinitionRegistry) {
		BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
		//存放BFPP
		List regularPostProcessors = new ArrayList<>();
		//存放执行过的BDRPP
		List registryProcessors = new ArrayList<>();
		
		for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
			//把传过来的BFPP进行区分,先执行BDRPP
			if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
				BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor;
				registryProcessor.postProcessBeanDefinitionRegistry(registry);
				registryProcessors.add(registryProcessor);
			}
			else {
				regularPostProcessors.add(postProcessor);
			}
		}
		// 保存当前需要执行的BDRPP
		List currentRegistryProcessors = new ArrayList<>();
		// 在bean定义信息中获取所有BDRPP ,这里先执行实现了PriorityOrdered接口的对象
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				// 获取Bean实例,这里实例化后,方便下面进行调用
				currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
				// 将要执行的BFPP添加到processedBeans,避免后续重复执行
				processedBeans.add(ppName);
			}
		}
		// 排序
		sortPostProcessors(currentRegistryProcessors, beanFactory);
		// 添加到已执行过的集合中
		registryProcessors.addAll(currentRegistryProcessors);
		//执行
		invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
		// 清空 方便后面继续使用
		currentRegistryProcessors.clear();

		// 这里再次获取,执行实现Ordered的借口的BDRPP(这里逻辑和前面非常相似)
		//这里为什么要重复获取呢?因为当咱们执行invoke的时候有可能会添加新的BDRPP(就是添加新的BeanDefiniton)
		postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
		for (String ppName : postProcessorNames) {
			if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
				currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
				processedBeans.add(ppName);
			}
		}
		//排序
		sortPostProcessors(currentRegistryProcessors, beanFactory);
		//添加到已执行容器
		registryProcessors.addAll(currentRegistryProcessors);
		//执行
		invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
		//清空
		currentRegistryProcessors.clear();

		// 处理普通的BDRPP
		boolean reiterate = true;
		while (reiterate) {
			reiterate = false;
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			//过滤掉已经执行的BDRPP
			for (String ppName : postProcessorNames) {
				if (!processedBeans.contains(ppName)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
					reiterate = true;
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();
		}

		// 上面已经执行过BDRPP,接下来执行所有的BFPP(registryProcessors优先级在上面已经定义好了,接下来就是按照上面执行的顺序依次调用)
		invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
	}else {
		invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
	}

	// 获取BFPP,为什么需要重新获取呢?上面不是已经获取过了BDRPP了?
	//因为存在一个类实现了BDRPP而未实现BFPP的可能
	String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

	// 这里就是为了分组,然后再排序执行(规则priority->ordered->nonOrdered)
	List priorityOrderedPostProcessors = new ArrayList<>();
	List orderedPostProcessorNames = new ArrayList<>();
	List nonOrderedPostProcessorNames = new ArrayList<>();
	for (String ppName : postProcessorNames) {
		if (processedBeans.contains(ppName)) {
			// 如果已经执行过了,忽略
		}else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
		}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}else {
			nonOrderedPostProcessorNames.add(ppName);
		}
	}

	// 执行实现了priority的BFPP
	sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

	// 执行实现了ordered的BFPP
	List orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
	for (String postProcessorName : orderedPostProcessorNames) {
		orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
	}
	sortPostProcessors(orderedPostProcessors, beanFactory);
	invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

	// 最后执行普通的BFPP
	List nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
	for (String postProcessorName : nonOrderedPostProcessorNames) {
		nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
	}
	invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
	
	beanFactory.clearmetadataCache();
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/762816.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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