这个方法算是 spring 框架中 比较长的方法了。第一次看,感觉比较乱,有一个 大大的 if分支,if分支里面还有好几个 for循环,还有一个while循环。if分支结束后,紧接着还有好几个for循环。集合变量也挺多的,看着看着就晕了。现在进行拆解一下看看。
主要分两大块:
1. 找到所有的 BeanDefinitionRegistryPostProcessor 并调用
2. 找到所有的 BeanFactoryPostProcessor 并调用
第一次看的时候,对第一部分有点迷糊,方法名是 invokeBeanFactoryPostProcessor,你这里干啥要调用BeanDefinitionRegistryPostProcessor,所以 这里 实际可以拆分成两个小方法就好了。
代码分析:
Set<String> processedBeans = new HashSet<>();
这个集合,记录了 找到的所有的的BeanDefinitionRegistryPostProcessor,用来在后面调用BeanFactoryPostProcessor时进行过滤
if (processedBeans.contains(ppName)) { // skip - already processed in first phase above }
因为在找 BeanFactoryPostProcessor时,BeanDefinitionRegistryPostProcessor也会找到,所以这里需要过滤一下,前面步骤已经执行了BeanDefinitionRegistryPostProcessor。
在if分支中:
首先对入参集合 List<BeanFactoryPostProcessor> beanFactoryPostProcessors 进行处理,把 集合中 BeanDefinitionRegistryPostProcessor 加到 registryProcessors 集合中,其他的加到regularPostProcessors。并且执行 集合中 BeanDefinitionRegistryPostProcessor。
然后,再找到所有的BeanDefinitionRegistryPostProcessor,依次处理 PriorityOrdered、Ordered、其他,进行排序后调用 postProcessBeanDefinitionRegistry,然后加入到registryProcessors 集合中。
最后,调用 registryProcessors集合 和 regularPostProcessors 集合中的 postProcessBeanFactory
这样,第一步就执行完毕。
紧接着,找到所有的BeanFactoryPostProcessor,如果之前已经执行了,则不处理,其他的根据PriorityOrdered、Ordered、其他添加到
ist<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); List<String> orderedPostProcessorNames = new ArrayList<>(); List<String> nonOrderedPostProcessorNames = new ArrayList<>();
然后进行排序,调用postProcessBeanFactory。
这样,这个方法就执行完了。