文章目录

  • 剑指spring源码(三)
    • 前言
    • 注册BeanPostProcessors

 

剑指spring源码(三)

前言

在我的spring源码系列文章已经写了注册bd和执行BeanFactory的后置处理器,spring容器到这里干的事情有注册了5个root bd,reader,并且解析了我们配置类appConfig。但是还有很多事情没做,比如注册BeanPostProcessors,实例化单例对象,循环引用等问题。
本文主要写注册BeanPostProcessors的流程。

注册BeanPostProcessors

代码调用如下

refresh()->
//BeanPostProcessors的作用是实例化bean时进行拦截,对bean增强
registerBeanPostProcessors(beanFactory);->
PostProcessorRegistrationDelegate#registerBeanPostProcessors();

注册BeanPostProcessors代码如下

public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
		//beanDefinitionNames这个集合中根据类型获取BeanPostProcessor,有两个,都是this这行代码添加进去的
		//在我的spring源码一中提到了beanDefinitionNames注册了五个bd,其中就有两个是BeanPostProcessor,这行代码就是这拿出这两个
		//org.springframework.context.annotation.internalAutowiredAnnotationProcessor->AutowiredAnnotationBeanPostProcessor.class
		//org.springframework.context.annotation.internalCommonAnnotationProcessor->CommonAnnotationBeanPostProcessor.class
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
		//beanPostProcessors集合有3个元素,这三个元素在哪里添加进去的? 见下面解释
		//3+1+2=6
		int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
		beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
		
		//存放实现PriorityOrdered的BeanPostProcessor
		List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		//存放实现MergedBeanDefinitionPostProcessor的BeanPostProcessor
		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
		//实现Ordered的BeanPostProcessor的name
		List<String> orderedPostProcessorNames = new ArrayList<>();
		//all regular BeanPostProcessors name
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		
		//AutowiredAnnotationBeanPostProcessor implements MergedBeanDefinitionPostProcessor,PriorityOrdered
		//CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor implements MergedBeanDefinitionPostProcessor,PriorityOrdered
		for (String ppName : postProcessorNames) {
			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
				priorityOrderedPostProcessors.add(pp);
				if (pp instanceof MergedBeanDefinitionPostProcessor) {
					internalPostProcessors.add(pp);
				}
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}
		//priorityOrderedPostProcessors和internalPostProcessors到这里为止都有两个
		
		// First, register the BeanPostProcessors that implement PriorityOrdered.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);//排序
		//注册BeanPostProcessors,实际就是添加到beanPostProcessors list集合
		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
		//ordered regular的BeanPostProcessors省略
		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
		//到此为止beanPostProcessors集合的里面的BeanPostProcessor如下
		//ApplicationContextAwareProcessor
		//ApplicationListenerDetector
		//ImportAwareBeanPostProcessor
		//AutowiredAnnotationBeanPostProcessor 
		//CommonAnnotationBeanPostProcessor 
		//BeanPostProcessorChecker
	}

beanPostProcessors集合添加三个元素的地方
位置一:refresh()->prepareBeanFactory(beanFactory);
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
位置二:
refresh()->
invokeBeanFactoryPostProcessors(beanFactory);->
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());->
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);->
ConfigrationClassPostProcessor#postProcessBeanFactory()->
beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory));

这三个元素分别是ApplicationContextAwareProcessor,ApplicationListenerDetector,ImportAwareBeanPostProcessor