今天复习Spring启动过程的时候,当分析invokeBeanFactoryPostProcessors方法的时候,发现自己对BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor这两个接口还是有点一知半解,现在单独开一章来单独分析这两个接口。
先来看一下这两个接口定义的翻译:
BeanFactoryPostProcessor:
1 | /** |
BeanDefinitionRegistryPostProcessor:
1 | /** |
使用
来看一下这两个接口的使用。主要在PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors方法中使用。
BeanDefinitionRegistryPostProcessor
首先获取类型上匹配BeanDefinitionRegistryPostProcessor的类名称:
1 | String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); |
默认情况下,这里获取到的postProcessorNames只有一个值:org.springframework.context.annotation.internalConfigurationAnnotationProcessor。这个值是在AnnotationConfigApplicationContext创建过程中,创建AnnotatedBeanDefinitionReader时加入的。AnnotatedBeanDefinitionReader构造函数中调用AnnotationConfigUtils.registerAnnotationConfigProcessors,在这个方法中,通过以下代码加入了internalConfigurationAnnotationProcessor的beanDefinition:
1 | if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) { |
获取名称之后再调用beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)获取这个bean,比如这里获取到的就是ConfigurationClassPostProcessor。
接着调用ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法,进行配置类的处理,包括:扫描目录加入所有的beanDefinition
到此为止,BeanDefinitionRegistryPostProcessor的工作完成了,此时所有的beanDefinition已经被加载。
总结一下,到目前为止,beanDefinition的映射表为:
org.springframework.context.annotation.internalConfigurationAnnotationProcessor->org.springframework.context.annotation.ConfigurationClassPostProcessororg.springframework.context.event.internalEventListenerFactory->org.springframework.context.event.DefaultEventListenerFactoryorg.springframework.context.event.internalEventListenerProcessor->org.springframework.context.event.EventListenerMethodProcessororg.springframework.context.annotation.internalAutowiredAnnotationProcessor->org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessororg.springframework.context.annotation.internalCommonAnnotationProcessor->org.springframework.context.annotation.CommonAnnotationBeanPostProcessororg.springframework.context.annotation.internalRequiredAnnotationProcessor->org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessorconfig->EnhancerBySpringCGLIB
其中前6个beanDefinition是在AnnotationConfigApplicationContext构造过程中由AnnotationConfigUtils.registerAnnotationConfigProcessors方法加入的。
config是Spring中我们的配置类,经过ConfigurationClassPostProcessor的postProcessBeanFactory方法的处理,包装了一个增强类。
BeanFactoryPostProcessor
由于BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor,因此需要调用ConfigurationClassPostProcessor的postProcessBeanFactory方法。该方法中使用ConfigurationClassEnhancer来增强配置类,以及增加一个BeanPostProcessor:ImportAwareBeanPostProcessor。
接着获取类型上匹配BeanFactoryPostProcessor的类名称:
1 | String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false); |
然后调用postProcessBeanFactory方法
默认只有ConfigurationClassPostProcessor一个BeanFactoryPostProcessor,所以后面的并没有执行其他的postProcessBeanFactory方法。