ApplicationContext.4 registerBeanPostProcessors解析

127 阅读1分钟

流程解析

  1. beanFactoryadd BeanPostProcessorChecker,该类主要的功能是记录非BeanPostProcessorbean 在被创建后, 是否被所有的 BeanPostProcessor 处理. 因为 autowire的存在,可能一个 bean 会在所有的 BeanPostProcessor 还未全部创建的时候现行创建成功.
  2. 查询出所有的 BeanPostProcessorbeanName,按照 是否实现 PriorityOrdered , Ordered, 普通的顺序 (目的是保证 BeanPostProcessor 的顺序调用) 依次加入到 beanFactory 中.
  3. 添加 ApplicationListenerDetector , 作用是如果一个bean 实现了 ApplicationListener 接口,并且是一个 singleton bean,则会通过 applicationContext.addApplicationListener 方法注册到 applicationCountext 中.

代码

/*--AbstractApplicationContext--*/
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
	//ApplicationListenerDetector,BeanPostProcessorChecker
	//获取所有BeanPostProcessor 定义的名称
	String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

	// Register BeanPostProcessorChecker that logs an info message when
	// a bean is created during BeanPostProcessor instantiation, i.e. when
	// a bean is not eligible for getting processed by all BeanPostProcessors.
	//计算总的BeanPostProcessor前,BeanPostProcessor的数量
	int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
	beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));

	// Separate between BeanPostProcessors that implement PriorityOrdered,
	// Ordered, and the rest.
	List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
	List<BeanPostProcessor> internalPostProcessors = new ArrayList<BeanPostProcessor>();
	List<String> orderedPostProcessorNames = new ArrayList<String>();
	List<String> nonOrderedPostProcessorNames = new ArrayList<String>();
	for (String ppName : postProcessorNames) {
		if (isTypeMatch(ppName, PriorityOrdered.class)) {
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			priorityOrderedPostProcessors.add(pp);
			if (pp instanceof MergedBeanDefinitionPostProcessor) {
				internalPostProcessors.add(pp);
			}
		}
		else if (isTypeMatch(ppName, Ordered.class)) {
			orderedPostProcessorNames.add(ppName);
		}
		else {
			nonOrderedPostProcessorNames.add(ppName);
		}
	}

	// First, register the BeanPostProcessors that implement PriorityOrdered.
	OrderComparator.sort(priorityOrderedPostProcessors);
	registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);

	// Next, register the BeanPostProcessors that implement Ordered.
	List<BeanPostProcessor> orderedPostProcessors = new ArrayList<BeanPostProcessor>();
	for (String ppName : orderedPostProcessorNames) {
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		orderedPostProcessors.add(pp);
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	OrderComparator.sort(orderedPostProcessors);
	registerBeanPostProcessors(beanFactory, orderedPostProcessors);

	// Now, register all regular BeanPostProcessors.
	List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<BeanPostProcessor>();
	for (String ppName : nonOrderedPostProcessorNames) {
		BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
		nonOrderedPostProcessors.add(pp);
		if (pp instanceof MergedBeanDefinitionPostProcessor) {
			internalPostProcessors.add(pp);
		}
	}
	registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);

	// Finally, re-register all internal BeanPostProcessors.
	OrderComparator.sort(internalPostProcessors);
	registerBeanPostProcessors(beanFactory, internalPostProcessors);
    //
	beanFactory.addBeanPostProcessor(new ApplicationListenerDetector());
}

tips

  1. beanFactory.addBeanPostProcessor 会删除以前添加的beanPostProcessor,然后再重新添加