Spring源码分析(二) invokeBeanFactoryPostProcessors 方法调用

在 xmlBeanDefinition 解析后,实例化之前,可用此接口完成对 beanDefinition 的动态修改
主要是对实现了 BeanDefinitionRegistryPostProcessor BeanFactoryPostProcessor  接口的调用
 
下面看一下源码,比较简单
 
进入 invokeBeanFactoryPostProcessors方法,看一下代码
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

			// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); //获取所有BeanDifinitionRegisterPostProcessor接口的实现类
			for (String ppName : postProcessorNames) {
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {  //判断是否实现了PriorityOrdered接口
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); //加入到集合中
					processedBeans.add(ppName);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory); //对集合中的对象排序
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);//对实现了PriorityOrdered排序接口的实现类调用
			currentRegistryProcessors.clear();//清空集合,避免下面重复调用

  

上面是对 BeanDifinitionRegisterPostProcessor 实现类并且实现了 PriorityOrdered排序接口的调用
下面还有对 实现了ordered接口和 没有实现排序接口 的实现类调用,代码就不贴出来了
 
还有 BeanFactoryPostProcessor  接口的实现类调用,套路是一样的
简单看一下代码
String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);//同样,先获取实现类

		// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {//遍历,将实现不同排序接口的实现类放在对应的集合中
			if (processedBeans.contains(ppName)) {
				// skip - already processed in first phase above
			}
			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);
			}
		}

  具体实现方法的调用,就不一一解释了

 

 

来看一下这两个接口

 

 

 

 

 

总结一下,这两个接口分别可以持有beanFactory 和 beanDifinitionRegister 对象

可用此接口完成对 beanDefinition 的动态 增删改查

 

posted @ 2021-03-26 11:13  _Magical  阅读(91)  评论(0)    收藏  举报