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定义发生变化,故调用了多次,不知道大家时怎么理解的,想请教大家,谢谢。
看起来这段循环的逻辑是这样的:BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry本来就是用来操作BeanDefinition的,但是不是这个原因这里循环,担心的是自己定义的postProcessBeanDefinitionRegistry对象,执行invokeBeanDefinitionRegistryPostProcessors方法时候,自己再注册一些BeanDefinitionRegistryPostProcessor这样的对象,通过registry.registerBeanDefinition()可以做到, 有点递归的意思吧. 以上属于我的见解,BeanDefinitionRegistryPostProcessor这个的实例本来就是在实例化bean之前进行额外处理,可以达到移花接木的效果吧.