invokeBeanDefinitionRegistryPostProcessors方法解析

在上一篇《Spring-IOC原理之invokeBeanFactoryPostProcessor详解》中我们提到了一个方法invokeBeanDefinitionRegistryPostProcessors()。也说了这个方法最终会调用ConfigurationClassPostProcessor类中的postProcessBeanDefinitionRegistry方法。并且在这个方法中会解析@Import@Component等注解和创建CGLIB动态代理。那么这一篇我们来详细看一下这个调用链中的方法。

先找到refresh()方法中的invokeBeanFactoryPostProcessors(),然后找到方法中的invokeBeanDefinitionRegistryPostProcessors方法。

PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

然后Ctrl+鼠标左键进入到该方法中

1
2
3
4
5
6
private static void invokeBeanDefinitionRegistryPostProcessors(Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {
for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {
/** 这里调用ConfigutationClassPostProcessor处理beanDefinitionMap中的bean定义 */
postProcessor.postProcessBeanDefinitionRegistry(registry);
}
}

循环遍历了传进来的postProcessors,不过postProcessors中只有一个类是ConfigurationClassPostProcessor。然后调用postProcessBeanDefinitionRegistry

Debug-invokeBeanDefinitionRegistryPostProcessors

这里还有一个点,就是postProcessBeanDefinitionRegistry方法,这个方法是BeanDefinitionRegistryPostProcessor接口中的方法,所以要想看方法内的实现逻辑只能找实现类中该方法的实现逻辑;通过上面的调试图片我们可以知道,postProcessorConfigurationClassPostProcessor类型,而ConfigurationClassPostProcessor切好也实现了BeanDefinitionRegistryPostProcessors接口,当然也实现了这个接口中的方法。所以这里我们只要去ConfigurationClassPostProcessor类中去找方法即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
int registryId = System.identityHashCode(registry);
if (this.registriesPostProcessed.contains(registryId)) {
throw new IllegalStateException(
"postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);
}
if (this.factoriesPostProcessed.contains(registryId)) {
throw new IllegalStateException(
"postProcessBeanFactory already called on this post-processor against " + registry);
}
this.registriesPostProcessed.add(registryId);

/** 这里会解析配置类的一些注解,例如@Configutation@Component@Import等配置注解 */
processConfigBeanDefinitions(registry);
}

postProcessBeanDefinitionRegistry方法中,我们直接看到最后一行,调用了processConfigBeanDefinitions(registry),这个方法主要是解析@Component@Import等配置注解。想要了解processConfigBeanDefinitioins中具体流程可以查看这一篇。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信