今天复习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.ConfigurationClassPostProcessor
org.springframework.context.event.internalEventListenerFactory
->org.springframework.context.event.DefaultEventListenerFactory
org.springframework.context.event.internalEventListenerProcessor
->org.springframework.context.event.EventListenerMethodProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
->org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
->org.springframework.context.annotation.CommonAnnotationBeanPostProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
->org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor
config
->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
方法。