六 Spring 源码学习扩展功能 上篇( 三 )


所以前面的 ssors 数组列表 , 是让我们通过硬编码方法方式 , 手动添加进去 , 然后通过 .() 方法后 , 再执行硬编码的后处理器
例如下面这个例子
public class HardCodeBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("Hard Code BeanFactory Post Processor execute time"); } } // 硬编码 后处理器执行时间 BeanFactoryPostProcessor hardCodeBeanFactoryPostProcessor = new HardCodeBeanFactoryPostProcessor(); context.addBeanFactoryPostProcessor(hardCodeBeanFactoryPostProcessor); // 更新上下文 context.refresh(); // 输出: //Hard Code BeanFactory Post Processor execute time //Car{maxSpeed=0, brand='*****', price=10000.0} System.out.println(context.getBean("car"));
激活 ssor
看完了怎么使用后 , 我们来分析下是如何识别和执行 ssor , 入口方法:
org....#
实际上 , 委派了 .(,()) 代理进行执行 。由于代码有点长 , 所以我画了一个流程图 , 可以结合流程图来分析代码:
流程图
代码
public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List beanFactoryPostProcessors) { Set processedBeans = new HashSet<>(); // beanFactory 默认使用的是 DefaultListableBeanFactory , 属于 BeanDefinitionRegistry if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; // 两个后处理器列表 List regularPostProcessors = new ArrayList<>(); List registryProcessors = new ArrayList<>(); // 硬编码注册的后处理器 for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { // 分类处理 } List currentRegistryProcessors = new ArrayList<>(); // 首先 , 调用实现 priorityOrder 的 beanDefinition 这就是前面提到过的优先级概念 , 这一步跟下面的优先级不一样之处 , 这一步的优先级是带有权重 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(); // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered. 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); // 执行 definitionRegistryPostProcessor 接口的方法 :postProcessBeanDefinitionRegistry invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.最后 , 调用所有其他后处理器 , 直到不再出现其他 bean 为止 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 回调方法 invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); } else { invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); } // 不要在这里初始化 factoryBean:我们需要保留所有常规 bean 未初始化 , 以便让 bean 工厂后处理程序应用于它们 // 注释 6.4 在这个步骤中 , 我们自定义的 carBeanFactoryPostProcessor 才真正注册并执行 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);. // 跳过分类的逻辑 // 首先执行的是带有权重顺序的后处理器 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); // 下一步执行普通顺序的后处理器 List