Spring源码解析之BeanPostProcessor

前言

AbstractApplicationContext类

refresh()方法

spring在bean的注册与实例化之间会出现如下代码

//bean的注册 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  //1. Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory);  //2. Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory);  //3. Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory);  //bean的实例化 finishBeanFactoryInitialization(beanFactory);

1.在AbstractApplicationContext为一个空方法,其子类对该方法进行了重写
2.BeanDefinitionRegistryPostProcessor与BeanFactoryPostProcessor接口的调用
3.把实现了BeanPostProcessor接口的类实例化,并且加入到BeanFactory中

invokeBeanFactoryPostProcessors()的源码分析

看个例子

BeanDefinitionTest类

@Component public class BeanDefinitionTest implements BeanDefinitionRegistryPostProcessor {     @Override     public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {         GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();         genericBeanDefinition.setBeanClass(BeanClass.class);         MutablePropertyValues propertyValues = genericBeanDefinition.getPropertyValues();         propertyValues.addPropertyValue(username, 蔡徐坤);         beanDefinitionRegistry.registerBeanDefinition(beanClass, genericBeanDefinition);     }      @Override     public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {         BeanClass beanClass = (BeanClass) configurableListableBeanFactory.getBean(beanClass);         System.out.println(postProcessBeanFactory=+beanClass.getUsername());     } }

BeanClass类

@Data public class BeanClass {     private String username; }

测试方法

 @Test     public void test5() {         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(cn.com.dq);         BeanClass beanClass = (BeanClass) applicationContext.getBean(beanClass);         System.out.println(beanClass.getUsername());     }

结果输出

从上述例子我们来看invokeBeanFactoryPostProcessors()的源码

PostProcessorRegistrationDelegate类

invokeBeanFactoryPostProcessors()方法

public static void invokeBeanFactoryPostProcessors( 			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {  		// Invoke BeanDefinitionRegistryPostProcessors first, if any. 		Set<String> processedBeans = new HashSet<>();  		if (beanFactory instanceof BeanDefinitionRegistry) { 			BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; 			List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>(); 			List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();  			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接口的所有类的BeanDefinition对象的beanName 			// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered. 			String[] postProcessorNames = 					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); 			for (String ppName : postProcessorNames) { 				//判断是否实现了排序接口 PriorityOrdered 				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();  			// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered. 			postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); 			for (String ppName : postProcessorNames) {  				//判断是否是实现的Ordered接口 				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; 			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(); 			}  			//调用postProcessBeanFactory方法 			// Now, invoke the postProcessBeanFactory callback of all processors handled so far. 			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); 			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); 		}  		else { 			// Invoke factory processors registered with the context instance. 			invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); 		}  		//获取实现了BeanFactoryPostProcessor接口的类,获取beanDefinition的名称 		// 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<>(); 		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. 		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);  		//调用 		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);  		// Next, invoke the BeanFactoryPostProcessors that implement Ordered. 		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(); 		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<>(); 		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接口的beanName
2.注意这行代码

currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));

我们知道beanFactory.getBean()是bean的实例化,这里是优先将实现BeanDefinitionRegistryPostProcessor接口的bean进行实例化,然后加入到currentRegistryProcessors容器中
3.接下来执行了这行代码

invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);  private static void invokeBeanDefinitionRegistryPostProcessors( 			Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {  		for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) { 			postProcessor.postProcessBeanDefinitionRegistry(registry); 		} 	}

我们可以看到最终是执行了BeanDefinitionRegistryPostProcessor 接口的postProcessBeanDefinitionRegistry方法
4.我们回过来看我们写的demo类

我们在postProcessBeanDefinitionRegistry方法中重新注册了一个我们新创建的bean叫做beanClass,并且给beanClass里的属性赋值了蔡徐坤
5.执行完所有的有关BeanDefinitionRegistryPostProcessor 接口的postProcessBeanDefinitionRegistry方法调用后
接着调用了如下代码

invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);  private static void invokeBeanFactoryPostProcessors( 			Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {  		for (BeanFactoryPostProcessor postProcessor : postProcessors) { 			postProcessor.postProcessBeanFactory(beanFactory); 		} 	}

从上面可以看出 是执行了BeanDefinitionRegistryPostProcessor 接口的postProcessBeanFactory方法
BeanDefinitionRegistryPostProcessor接口继承了BeanFactoryPostProcessor接口,postProcessBeanFactory方法为
BeanFactoryPostProcessor中的方法
6.回到demo

我们在这个方法中通过getBean操作实例化了beanClass然后打印了该实例中的属性,因此能解释我们写的demo控制台的输出
7.通过与BeanDefinitionRegistryPostProcessor 相同的方式,处理了实现BeanFactoryPostProcessor接口的bean的postProcessBeanFactory方法的调用

registerBeanPostProcessors方法的源码分析

PostProcessorRegistrationDelegate类

registerBeanPostProcessors方法

public static void registerBeanPostProcessors( 			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {  		//拿到工程里面所有实现了BeanPostProcessor接口的类,获取到BeanDefinition的名称 		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. 		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<>(); 		List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); 		List<String> orderedPostProcessorNames = new ArrayList<>(); 		List<String> nonOrderedPostProcessorNames = new ArrayList<>();  		//提前实例化BeanPostProcessor类型的bean,然后bean进行排序 		for (String ppName : postProcessorNames) { 			if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {  				//getBean是实例化方法,后面我们在讲bean实例化过程 				BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); 				priorityOrderedPostProcessors.add(pp);  				//判断类型是否是MergedBeanDefinitionPostProcessor,如果是则代码是内部使用的 				if (pp instanceof MergedBeanDefinitionPostProcessor) { 					internalPostProcessors.add(pp); 				} 			} 			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { 				orderedPostProcessorNames.add(ppName); 			} 			else { 				nonOrderedPostProcessorNames.add(ppName); 			} 		}  		// First, register the BeanPostProcessors that implement PriorityOrdered. 		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);  		//注册到BeanFactory中 		registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);  		// Next, register the BeanPostProcessors that implement Ordered. 		List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(); 		for (String ppName : orderedPostProcessorNames) { 			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); 			orderedPostProcessors.add(pp); 			if (pp instanceof MergedBeanDefinitionPostProcessor) { 				internalPostProcessors.add(pp); 			} 		} 		sortPostProcessors(orderedPostProcessors, beanFactory); 		registerBeanPostProcessors(beanFactory, orderedPostProcessors);  		// Now, register all regular BeanPostProcessors. 		List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(); 		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. 		sortPostProcessors(internalPostProcessors, beanFactory); 		registerBeanPostProcessors(beanFactory, internalPostProcessors);  		// Re-register post-processor for detecting inner beans as ApplicationListeners, 		// moving it to the end of the processor chain (for picking up proxies etc). 		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); 	}

1.拿到工程里面所有实现了BeanPostProcessor接口的类,获取到BeanDefinition的名称
2.遍历所有的beanName,在循环中,我们看到一个比较重要的代码

BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp);

我们知道beanFactory.getBean()是bean的实例化,所以,我们可以得到spring容器在实例化bean的时候,优先实例化的是BeanPostProcessor类型的bean,为什么要优先实例化BeanPostProcessor类型的bean,因为其他bean的实例化需要调用BeanPostProcessor里面的方法
3.实例化BeanPostProcessor类型的bean以后,接下来会将这些bean注册到beanFactory的beanPostProcessors容器中

registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);  private static void registerBeanPostProcessors( 			ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {  		for (BeanPostProcessor postProcessor : postProcessors) { 			beanFactory.addBeanPostProcessor(postProcessor); 		} 	}  AbstractBeanFactory类 public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) { 		Assert.notNull(beanPostProcessor, BeanPostProcessor must not be null); 		// Remove from old position, if any 		this.beanPostProcessors.remove(beanPostProcessor); 		// Track whether it is instantiation/destruction aware 		if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) { 			this.hasInstantiationAwareBeanPostProcessors = true; 		} 		if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) { 			this.hasDestructionAwareBeanPostProcessors = true; 		} 		// Add to end of list 		this.beanPostProcessors.add(beanPostProcessor); 	}

这里有一个比较有意思的变量hasInstantiationAwareBeanPostProcessors ,在bean实例化的时候,会利用到这个变量
在bean实例化的时候会解释这个变量的作用

总结

1.invokeBeanFactoryPostProcessors方法首先是对实现了BeanDefinitionRegistryPostProcessor接口的bean进行了实例化,接着对BeanDefinitionRegistryPostProcessor中的postProcessBeanDefinitionRegistry方法进行了调用,然后对BeanDefinitionRegistryPostProcessor中的 postProcessBeanFactory方法进行了调用
2.invokeBeanFactoryPostProcessors 接下来对实现了BeanFactoryPostProcessor接口的bean进行了实例化,然后对BeanFactoryPostProcessor中的postProcessBeanFactory方法进行了调用
3.registerBeanPostProcessors()提前对所有实现了BeanPostProcessor 接口的bean进行实例化,然后将这些bean注册到beanFactory的beanPostProcessors容器中
4.spring在bean的实例化过程中,优先实例化的是实现了BeanDefinitionRegistryPostProcessor的bean,其次是实现了
BeanFactoryPostProcessor接口的bean,再次是实现了BeanPostProcessor 接口的bean,最后是普通bean