Spring源码关于PostProcessorRegistrationDelegate的问题?

Spring源码关于PostProcessorRegistrationDelegate的问题?

Spring4.0以上版本中关于

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()

的一个疑问:

在该方法中,我们可以看到,其多次调用了下面的方法:

postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false)

甚至还在循环中调用了该方法:

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();
            }

我的猜想是可能在调用

postProcessor.postProcessBeanDefinitionRegistry(registry);

方法时,会导致beanFactory中相关的bean定义发生变化,故调用了多次,不知道大家时怎么理解的,想请教大家,谢谢。

阅读 3.8k
1 个回答
新手上路,请多包涵

看起来这段循环的逻辑是这样的:BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry本来就是用来操作BeanDefinition的,但是不是这个原因这里循环,担心的是自己定义的postProcessBeanDefinitionRegistry对象,执行invokeBeanDefinitionRegistryPostProcessors方法时候,自己再注册一些BeanDefinitionRegistryPostProcessor这样的对象,通过registry.registerBeanDefinition()可以做到, 有点递归的意思吧. 以上属于我的见解,BeanDefinitionRegistryPostProcessor这个的实例本来就是在实例化bean之前进行额外处理,可以达到移花接木的效果吧.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题