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