第五章 spring-connet之核心类PostProcessorRegistrationDelegate与BeanFactoryPostProcessor体系

原创
2019/09/18 17:59
阅读数 654

前言

前面讲了reser方法,

PostProcessorRegistrationDelegate核心方法

  1. invokeBeanFactoryPostProcessors

    执行BeanDefinitionRegistry接口与 BeanDefinitionRegistryPostProcessor接口的实现类

  2. registerBeanPostProcessors

    BeanDefinitionRegistry的子类进行排序

invokeBeanFactoryPostProcessors解读

  1. 执行invokeBeanFactoryPostProcessors方法形参beanFactoryPostProcessors里面的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
  2. 执行beanFactory里面的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry的postProcessBeanDefinitionRegistry方法
  3. 循环得到beanFactory里面的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry方法
  4. 在执行BeanDefinitionRegistryPostProcessor的实现类的postProcessBeanFactory方法
  5. 在执行invokeBeanFactoryPostProcessors方法形参beanFactoryPostProcessors里面的BeanFactoryPostProcessor实现类的postProcessBeanFactory方法
  6. 执行beanFactory里面的BeanFactoryPostProcessor实现类的postProcessBeanFactory方法
  7. 进行排序在执行实现类,排序分类是先对实现PriorityOrdered的类进行排序并执行,在对实现Ordered的类进行排序并执行,最后对其他类执行。
public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {

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

		if (beanFactory instanceof BeanDefinitionRegistry) {
			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
			List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList<BeanFactoryPostProcessor>();
			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new LinkedList<BeanDefinitionRegistryPostProcessor>();
					//  执行invokeBeanFactoryPostProcessors方法形参beanFactoryPostProcessors里面的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
			for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
					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.
			List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();

			// 执行beanFactory里面的BeanDefinitionRegistryPostProcessor与PriorityOrdered实现类的postProcessBeanDefinitionRegistrypostProcessBeanDefinitionRegistry方法
			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);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
			currentRegistryProcessors.clear();

			// 执行beanFactory里面的BeanDefinitionRegistryPostProcessor与Ordered实现类的postProcessBeanDefinitionRegistrypost方法
			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();

			// 循环得到beanFactory里面的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry方法。会排除已经执行的对象
			boolean reiterate = true;
			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();
			}

			//  在执行BeanDefinitionRegistryPostProcessor的实现类的postProcessBeanFactory方法
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			// 在执行invokeBeanFactoryPostProcessors方法形参beanFactoryPostProcessors里面的BeanFactoryPostProcessor实现类的postProcessBeanFactory方法
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
		}

		else {
			// Invoke factory processors registered with the context instance.
			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, 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.
		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 (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);
			}
		}

		// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

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

		// Finally, invoke all other BeanFactoryPostProcessors.
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanFactoryPostProcessor>();
		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();
	}

BeanFactoryPostProcessor体系

BeanFactoryPostProcessor体系主要是由BeanFactoryPostProcessor与子接口BeanDefinitionRegistryPostProcessor构成

BeanFactoryPostProcessor可以对ConfigurableListableBeanFactory对象进行操作。

public interface BeanFactoryPostProcessor {

	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}
  1. BeanDefinitionRegistryPostProcessor调用BeanDefinitionRegistry.registerBeanDefinition的方法注册BeanDefinition
  2. BeanDefinitionRegistryPostProcessor调用BeanDefinitionRegistry.registerBeanDefinition的方法注册BeanDefinition
  3. BeanDefinitionRegistryPostProcessor调用BeanDefinitionRegistry.registerBeanDefinition的方法注册BeanDefinition
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {

	void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}

上面有一句这样的话:循环得到beanFactory里面的BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry方法。会排除已经执行的对象。大家是不是能难理解。比如BeanDefinitionRegistryPostProcessor的实现类A向BeanDefinitionRegistry注册了BeanDefinitionRegistryPostProcessor的实现类B.然后B注册了C。那B,C如何被执行。可以通过上面标注的循环的代码就可以解决了。

基于BeanDefinitionRegistryPostProcessor实现spring 扫描默认路径下的class

注册ConfigurationClassPostProcessor

AnnotationConfigUtils的registerAnnotationConfigProcessors会向BeanDefinitionRegistry注册ConfigurationClassPostProcessor。

public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
			BeanDefinitionRegistry registry, @Nullable Object source) {
		.......
		Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(4);

		if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
		}
		.......
		return beanDefs;
	}
调用链

AnnotationConfigApplicationContext,AnnotationConfigServletWebServerApplicationContext,AnnotationConfigReactiveWebServerApplicationContext都是默认的注解app上下文容器,所有的AnnotationConfigs都会默认注册ConfigurationClassPostProcessor。

总结

  1. PostProcessorRegistrationDelegate 是applincationContext最关键的类之一
  2. BeanFactoryPostProcessor是整个applincationContext最核心的体系,mybatis的mapper,dubbo的server都是给予BeanFactoryPostProcessor体系实现
  3. 所有AnnotationConfig上线文都会注册ConfigurationClassPostProcessor
展开阅读全文
加载中

作者的其它热门文章

打赏
0
1 收藏
分享
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部