spring源码阅读(二)--ioc容器加载(五)--invokeBeanFactoryPostProcessors()

本文深入探讨了Spring框架中invokeBeanFactoryPostProcessors方法的工作原理,解析了如何通过代码方式注册bean定义,以及如何对已注册的bean定义进行操作。

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

前面我们讲解了postProcessBeanFactory(beanFactory); 是spring留给我们的扩展点,该扩展点是一个bean工厂的后置处理器,那么这些bean工厂会给我们带来什么要的威力呢,下面开始关于invokeBeanFactoryPostProcessors()的源码分析

	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		//委托给PostProcessorRegistrationDelegate去调用
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

		// 判断工厂中是否存在名字包含loadTimeWeaver的bean,如果存在将会将临时的类加载器进行set,并且添加bean的后置处理器,
		if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
	}

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

	public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

		//如果存在BeanDefinitionRegistryPostProcessors,先调用BeanDefinitionRegistryPostProcessors方法
		Set<String> processedBeans = new HashSet<>();
		//如果bean工厂实现了BeanDefinitionRegistry,我们创建的工厂是DefaultListableBeanFactory,
		// 根据类图可以得知是肯定实现了BeanDefinitionRegistry的,这段逻辑主要是吧后置处理器全部找出来
		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
					//开始调用postProcessBeanDefinitionRegistry方法
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					//将调用过的处理器存入registryProcessors
					registryProcessors.add(registryProcessor);
				}
				else {
					//没有实现的BeanDefinitionRegistryPostProcessor也会加入到处理过的registryProcessors
					regularPostProcessors.add(postProcessor);
				}
			}


			//不要在这里初始化工厂bean,我们需要保留所有的普通bean
			//让bean工厂后置处理器去调用没有初始化的bean
			//独立的BeanDefinitionRegistryPostProcessors实现
			//诸如PriorityOrdered,Ordered此类的
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

			//首先,调用实现了PriorityOrdered的BeanDefinitionRegistryPostProcessors
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					//根据名称和类型获取bean,并加入到当前需要调用的容器中currentRegistryProcessors,
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					//同时也将处理过的bean加入到processedBeans集合中去
					processedBeans.add(ppName);
				}
			}
			//对currentRegistryProcessors集合中BeanDefinitionRegistryPostProcessor进行排序
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			//把他加入到用于保存的registryProcessors中
			registryProcessors.addAll(currentRegistryProcessors);
			//调用它的后置处理器
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			//调用完之后,马上clear掉
			currentRegistryProcessors.clear();

			//其次,开始调用实现了Ordered的BeanDefinitionRegistryPostProcessors
			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
			registryProcessors.addAll(currentRegistryProcessors);
			//开始挨个调用
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			//清空掉容器,方便下次使用
			currentRegistryProcessors.clear();

			// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
			//最后,开始调用其他的BeanDefinitionRegistryPostProcessors,知道没有其他的处理器出现为止(处理所有的后置处理器)
			//核心调用逻辑
			boolean reiterate = true;
			while (reiterate) {
				reiterate = false;
				//查出所有实现了BeanDefinitionRegistryPostProcessor接口的bean名称
				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
					//前面的逻辑中,已经对实现了PriorityOrdered和Ordered的bean都处理过了,因此通过processedBeans过滤,processedBeans中没有的才会在此处理
					if (!processedBeans.contains(ppName)) {
						//根据名称和类型获取bean,并加入到currentRegistryProcessors,
						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
						//把需要调用的bean的名称放到processedBeans
						processedBeans.add(ppName);
						//跳出循环
						reiterate = true;
					}
				}
				//排序
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				//将已经调用过的也存在的registryProcessors
				registryProcessors.addAll(currentRegistryProcessors);
				//开始挨个调用
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
				//清空掉容器
				currentRegistryProcessors.clear();
			}

			// 现在,开始调用所有处理过的处理器的回调
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

以上就是invokeBeanFactoryPostProcessors源码部分的解读,这里主要允许我们通过代码的方式注册bean定义,允许对已注册的bean定义进行获取,删除,修改等

参考博客:https://blog.youkuaiyun.com/v123411739/article/details/87741251(感谢博主的无私奉献)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值