ApplicationContext.3 invokeBeanFactoryPostProcessors解析

94 阅读2分钟

tips

  1. 如果beanFactoryBeanDefinitionRegistry的子类,则会又一次机会再次创建和注册BeanDefiniton。(通过BeanDefinitionRegistryPostProcessor接口)
  2. 存在手动注册和资源文件配置的BeanFactoryPostProcessors
  3. 按照PriorityOrderedOrdered,常规的进行排序。其中PriorityOrderedOrdered可以组合使用。
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	// Invoke BeanDefinitionRegistryPostProcessors first, if any.
	Set<String> processedBeans = new HashSet<String>();
	//如果beanFactory是BeanDefinitionRegistry,则可以在此之前再次进行新的beanDefinition的定义和注册
	//key实现默认的BeanDefinition的注入
	if (beanFactory instanceof BeanDefinitionRegistry) {
		BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
		List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();
		List<BeanDefinitionRegistryPostProcessor> registryPostProcessors =
				new LinkedList<BeanDefinitionRegistryPostProcessor>();
		//收集手动注入BeanFactoryPostProcessor,getBeanFactoryPostProcessors
		for (BeanFactoryPostProcessor postProcessor : getBeanFactoryPostProcessors()) {
			if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
				BeanDefinitionRegistryPostProcessor registryPostProcessor =
						(BeanDefinitionRegistryPostProcessor) postProcessor;
				//首先调用BeanDefinitionRegistryPostProcessor的方法,然后在收集起来
				registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
				registryPostProcessors.add(registryPostProcessor);
			}
			else {
				regularPostProcessors.add(postProcessor);
			}
		}
		//获取配置资源里面配置的BeanFactoryPostProcessor
		Map<String, BeanDefinitionRegistryPostProcessor> beanMap =
				beanFactory.getBeansOfType(BeanDefinitionRegistryPostProcessor.class, true, false);
		List<BeanDefinitionRegistryPostProcessor> registryPostProcessorBeans =
				new ArrayList<BeanDefinitionRegistryPostProcessor>(beanMap.values());
		//BeanFactoryPostProcessor 排序
		OrderComparator.sort(registryPostProcessorBeans);
		for (BeanDefinitionRegistryPostProcessor postProcessor : registryPostProcessorBeans) {
			postProcessor.postProcessBeanDefinitionRegistry(registry);
		}
		//调用手动注册的BeanDefinitionRegistryPostProcessor的postProcessBeanFactory
		invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
		//调用配置资源里面的BeanDefinitionRegistryPostProcessor的postProcessBeanFactory
		invokeBeanFactoryPostProcessors(registryPostProcessorBeans, beanFactory);
		//调用普通的BeanDefinitionPostProcessor
		invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		processedBeans.addAll(beanMap.keySet());
	}
	else {
		// Invoke factory processors registered with the context instance.
		//直接调用手动注册的普通的BeanFactoryPostProcessors
		invokeBeanFactoryPostProcessors(getBeanFactoryPostProcessors(), beanFactory);
	}

	// Do not initialize FactoryBeans here: We need to leave all regular beans
	// uninitialized to let the bean factory post-processors apply to them!
	//获取普通的
	String[] postProcessorNames =
			beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

	// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
	// Ordered, and the rest.
	//分类收集 继承PriorityOrdered的BeanFactoryPostProcessors,继承Ordered的BeanFactoryPostProcessors,然后是无排序的
	List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
	List<String> orderedPostProcessorNames = new ArrayList<String>();
	List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
	for (String ppName : postProcessorNames) {
		if (processedBeans.contains(ppName)) {
			// skip - already processed in first phase above
		}
		else if (isTypeMatch(ppName, PriorityOrdered.class)) {
			priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
		}
		else if (isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}
		else {
			nonOrderedPostProcessorNames.add(ppName);
		}
	}

	// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
	//PriorityOrdered 和ordered可以混用
	OrderComparator.sort(priorityOrderedPostProcessors);
	invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

	// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
	List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
	for (String postProcessorName : orderedPostProcessorNames) {
		orderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class));
	}
	OrderComparator.sort(orderedPostProcessors);
	invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

	// Finally, invoke all other BeanFactoryPostProcessors.
	List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
	for (String postProcessorName : nonOrderedPostProcessorNames) {
		nonOrderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class));
	}
	invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
}

流程描述

  1. 如果beanFactory 实现了 BeanDefinitionRegistry

    • 查找所有的BeanDefinitionRegistryPostProcessor.先处理BeanDefinitionRegistryPostProcessorpostProcessBeanDefinitionRegistry(BeanDefinitionRegistry)方法.
    • 处理顺序是先处理实现PriorityOrdered的,然后是实现Ordered接口的.再然后是普通的BeanDefinitionRegistryPostProcessor.
    • 因为postProcessBeanDefinitionRegistry(BeanDefinitionRegistry)会向BeanDefinitionRegistry(也就是beanfactory)中add新的BeanDefinition,所以处理每一个BeanDefinitionRegistryPostProcessor的时候都要再次通过beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false)获取新的BeanDefinitionRegistryPostProcessor
  2. 如果没有实现BeanDefinitionRegistry接口,则也按照上面的顺序依次处理所有的BeanFactoryPostProcessor.