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 的动态 增删改查
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号