2019.10.22笔记——spring内部扫描分析之invokeBeanFactoryPostProcessors解析

invokeBeanFactoryPostProcessors方法

对于spring扫描的整体流程前面已经分析过了,可以参考下面文章中对ClassPathBeanDefinitionScanner的分析。

spring中的ClassPathBeanDefinitionScanner

这里只是分析扫描过程中的invokeBeanFactoryPostProcessors方法
2019.10.22笔记——spring内部扫描分析之invokeBeanFactoryPostProcessors解析
在这个方法中主要实现了spring bean工厂的后置处理器的方法回调,spring bean工厂的后置处理器主要分为两类

  1. BeanFactoryPostProcessor
  2. BeanDefinitionRegistryPostProcessor

其中BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类

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

	// Invoke BeanDefinitionRegistryPostProcessors first, if any.
	Set<String> processedBeans = new HashSet<>();

	//这个bean工厂是DefaultListableBeanFactory,DefaultListableBeanFactory同样实现了BeanDefinitionRegistry
	if (beanFactory instanceof BeanDefinitionRegistry) {
		//这个bean工厂同样也是一个注册器
		BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;

		//这个list要放的是使用者自定义的BeanFactoryPostProcessor的是实现
		List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();

		//BeanDefinitionRegistryPostProcessor同样也是spring的扩展点之一,同时也是BeanFactoryPostProcessor的子类
		//使用者也可以实现这个BeanDefinitionRegistryPostProcessor接口来做一些增强
		//这个list要放的是使用者自定义的BeanDefinitionRegistryPostProcessor的是实现
		List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();

		//判断传进来的对象是属于实现了哪一个接口的实现类,并加入对应的set集合
		//循环遍历使用者自定义的BeanFactoryPostProcessor的实现
		for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
			if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
				BeanDefinitionRegistryPostProcessor registryProcessor =
						(BeanDefinitionRegistryPostProcessor) postProcessor;
				// 这里直接执行使用者通过api传进来的BeanDefinitionRegistryPostProcessor实现类中的方法
				registryProcessor.postProcessBeanDefinitionRegistry(registry);
				registryProcessors.add(registryProcessor);
			}
			else {
				regularPostProcessors.add(postProcessor);
			}
		}

		// Do not initialize FactoryBeans here: We need to leave all regular beans
		// uninitialized to let the bean factory post-processors apply to them!
		// Separate between BeanDefinitionRegistryPostProcessors that implement
		// PriorityOrdered, Ordered, and the rest.
		// 这里又创建了一个set集合,存放的同样是BeanDefinitionRegistryPostProcessor
		// 因为不只有使用者会实现BeanDefinitionRegistryPostProcessor
		// 这个集合是装的spring内部自己是实现的BeanDefinitionRegistryPostProcessor的对象
		// 为了区分又创建了一个set集合来存储
		List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();

		// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
				processedBeans.add(ppName);
			}
		}

		//排序
		sortPostProcessors(currentRegistryProcessors, beanFactory);

		//将用户的BeanDefinitionRegistryPostProcessor实现类和spring自己的是实现类的集合做了合并
		registryProcessors.addAll(currentRegistryProcessors);

		/**
		 * 完成扫描
		 * 这里将所有的BeanDefinitionRegistryPostProcessor的实现和注册器传了过去
		 * 这个方法也执行了所有的BeanDefinitionRegistryPostProcessor(包括自定义的和spring内部的)中实现的方法
		 * 十分重要
		 * 完成了绝大部分的bd的注册
		 */
		invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);

		// 清除list集合,节省空间
		currentRegistryProcessors.clear();

		// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
		// 找到所有实现Order接口的BeanDefinitionRegistryPostProcessors
		// 这个Order接口是用来决定执行顺序的
		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();

		// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
		boolean reiterate = true;
		// 这里之所以会需要循环是因为有可能在回调postProcessBeanDefinitionRegistry方法的时候可能会新注册BeanDefinitionRegistryPostProcessor的bean对象
		// 这是为了保障找到所有BeanDefinitionRegistryPostProcessor的实现类
		while (reiterate) {
			reiterate = false;
			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			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();
		}

		// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
		/**
		 * 这里开始执行BeanFactoryPostProcessors的实现类的回调方法
		 * 注意这里执行了两遍是因为registryProcessors虽然是BeanDefinitionRegistryPostProcessor的实现类
		 * 但是同样也是BeanFactoryPostProcessors的子类,所以同样也实现了BeanFactoryPostProcessors的方法
		 * 所以也需要调用
		 * 后面的invokeBeanFactoryPostProcessors方法则是传入BeanFactoryPostProcessor的实现类
		 */
		invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
	}

	else {
		// Invoke factory processors registered with the context instance.
		invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
	}
	/**
	 * 后面就是对所有BeanFactoryPostProcessor实现类(除了使用者通过api注入的)执行回调方法
	 */

	// Do not initialize FactoryBeans here: We need to leave all regular beans
	// uninitialized to let the bean factory post-processors apply to them!
	// 找到所有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
		}
		// 实现了PriorityOrdered接口的
		else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
			priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
		}
		// 实现类Ordered接口的
		else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}
		// 没有实现排序接口的
		else {
			nonOrderedPostProcessorNames.add(ppName);
		}
	}

	// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
	// 首先排序并执行实现了PriorityOrdered接口的实现类
	sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
	// 回调postProcessBeanFactory方法
	invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

	// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
	// 接下来排序并执行实现了Ordered接口的实现类
	List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
	for (String postProcessorName : orderedPostProcessorNames) {
		orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
	}
	sortPostProcessors(orderedPostProcessors, beanFactory);
	// 回调postProcessBeanFactory方法
	invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

	// Finally, invoke all other BeanFactoryPostProcessors.
	// 最后执行剩余的BeanFactoryPostProcessor实现类的回调方法postProcessBeanFactory
	List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
	for (String postProcessorName : nonOrderedPostProcessorNames) {
		nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
	}
	invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

	// Clear cached merged bean definitions since the post-processors might have
	// modified the original metadata, e.g. replacing placeholders in values...
	beanFactory.clearMetadataCache();
}

在这个方法中主要完成了下面几个步骤

  1. 首先会将使用者传递进来的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor实现类拿到,并分别放到两个list中,regularPostProcessors存放着实现了BeanFactoryPostProcessor的,registryProcessors存放着实现了BeanDefinitionRegistryPostProcessor的。注意这里的使用者自定义的处理器并不是通过注解方式注入的,而是通过api方法注入的。是通过AnnotationConfigApplicationContext.addBeanFactoryPostProcessor()方法注入的。同时在找到BeanDefinitionRegistryPostProcessor的实现类会直接回调postProcessBeanDefinitionRegistry方法。
  2. 接着会将spring内部已经注入的BeanDefinitionRegistryPostProcessor的实现类找出来,这里其实spring内部只是注入了一个实现类,不过相当重要,这个对象就是是ConfigurationClassPostProcessor,它完成了spring的许多工作,这里将它拿出来,放到一个currentRegistryProcessors集合中。
  3. 将使用者自己实现的BeanDefinitionRegistryPostProcessor实现类和spring内部的BeanDefinitionRegistryPostProcessor实现类通通聚合到currentRegistryProcessors集合中,接着执行接口中的postProcessBeanDefinitionRegistry方法(方法回调),在spring内部的实现类回调方法中,也就是ConfigurationClassPostProcessor中完成了对bean的扫描。
  4. 将currentRegistryProcessors集合清空,接着会从bd的map中拿到所有的BeanDefinitionRegistryPostProcessor是实现类,同时实现了Ordered接口,这里的Ordered接口其实就是决定后面回调执行顺序的,将这些处理器对象放入currentRegistryProcessors和registryProcessors集合中,接着回调执行处理器中的postProcessBeanDefinitionRegistry方法。
  5. 接着继续清空currentRegistryProcessors集合,从map中拿到剩余的BeanDefinitionRegistryPostProcessor实现类,将这些处理器对象放入currentRegistryProcessors和registryProcessors集合中,接着回调执行处理器中的postProcessBeanDefinitionRegistry方法。注意这里之所以会需要循环是因为有可能在回调postProcessBeanDefinitionRegistry方法的时候可能会新注册BeanDefinitionRegistryPostProcessor的bean对象,这是为了保障找到所有BeanDefinitionRegistryPostProcessor的实现类。
  6. if语句最后执行registryProcessors和regularPostProcessors集合中处理器的postProcessBeanFactory方法,这里先是执行的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanFactory方法,再执行的BeanFactoryPostProcessor的postProcessBeanFactory方法。
  7. 最后就是对所有BeanFactoryPostProcessor实现类(除了使用者通过api注入的)执行回调方法,同样是分为三类,实现PriorityOrdered接口的,实现Ordered接口的和没有实现排序接口的。

总结

  • 这个方法中主要是对BeanFactoryPostProcessors和BeanDefinitionRegistryPostProcessor是实现类的回调方法的调用。
  • 针对的实现类包括通过APIAnnotationConfigApplicationContext.addBeanFactoryPostProcessor()注入的BeanFactoryPostProcessors和BeanDefinitionRegistryPostProcessor的实现类,spring内部的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessors实现类,扫描出来的BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessors实现类。
  • 它们的回调方法执行顺序如下
  1. 通过APIAnnotationConfigApplicationContext.addBeanFactoryPostProcessor()注入的BeanDefinitionRegistryPostProcessor的实现类的postProcessBeanDefinitionRegistry方法。
  2. spring内部的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry方法。
  3. 扫描出来的BeanDefinitionRegistryPostProcessor实现类,且实现了Order接口,执行postProcessBeanDefinitionRegistry方法。
  4. 其余所有其他BeanDefinitionRegistryPostProcessor实现类,执行postProcessBeanDefinitionRegistry方法。
  5. 通过APIAnnotationConfigApplicationContext.addBeanFactoryPostProcessor()注入的BeanDefinitionRegistryPostProcessor的实现类、spring内部的BeanDefinitionRegistryPostProcessor实现类和扫描出来的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanFactory方法。
  6. 通过APIAnnotationConfigApplicationContext.addBeanFactoryPostProcessor()注入的BeanFactoryPostProcessors的postProcessBeanFactory方法。
  7. 扫描出来和spring内部的BeanFactoryPostProcessors和PriorityOrdered的实现类的postProcessBeanFactory方法。
  8. 扫描出来和spring内部的BeanFactoryPostProcessors和Ordered的实现类的postProcessBeanFactory方法。
  9. 扫描出来和spring内部的剩余的BeanFactoryPostProcessors实现类的postProcessBeanFactory方法。
上一篇:【计理02组04号】顺序查找


下一篇:shell脚本 通过变量形式获取一个时间段内的全部日期