上一篇文章我们分析了invokeBeanFactoryPostProcessors
方法中BeanFactoryPostProcessor
和BeanDefinitionRegistryPostProcessor
这两个接口发挥的作用。紧接着,Spring调用了registerBeanPostProcessors
接口在上下文中注册BeanPostProcessor
。这篇文章我们来分析一下BeanPostProcessor
接口发挥的作用。
首先看一下BeanPostProcessor
定义的翻译:
1 | /** |
registerBeanPostProcessors
接着再来看registerBeanPostProcessors
方法的工作,它直接委托给PostProcessorRegistrationDelegate.registerBeanPostProcessors
方法来执行。
首先调用beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false)
来获取所有匹配BeanPostProcessor
的类名。默认情况下能获得三个类名:
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
这三个值是在AnnotationConfigApplicationContext
创建过程中,创建AnnotatedBeanDefinitionReader
时加入的。AnnotatedBeanDefinitionReader
构造函数中调用AnnotationConfigUtils.registerAnnotationConfigProcessors
,在这个方法中,通过以下代码加入了这三个类的beanDefinition:
1 | if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) { |
获取到这三个BeanPostProcessor
的名称之后,往beanFactory中加了一个名为BeanPostProcessorChecker
的BeanPostProcessor
。
注意!这个时候beanFactory的beanPostProcessors
列表中已经存在了3个BeanPostProcessor
:
ApplicationContextAwareProcessor
ApplicationListenerDetector
ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor
其中:ApplicationContextAwareProcessor
和ApplicationListenerDetector
是在prepareBeanFactory
方法中加入的。ImportAwareBeanPostProcessor
是调用ConfigurationClassPostProcessor
的postProcessBeanFactory
方法是加入的。
接着将这三个BeanPostProcessor
按顺序注册到beanFactory中,添加在beanFactory的beanPostProcessors
列表的末尾。
最后再注册一个ApplicationListenerDetector
到beanFactory中,由于ApplicationListenerDetector
已经存在于beanFactory的beanPostProcessors
列表中,所以这里是先将原来的ApplicationListenerDetector
删除然后在beanPostProcessors
列表的末尾加入新的ApplicationListenerDetector
。
registerBeanPostProcessors
方法执行完成之后,beanFactory的beanPostProcessors
列表中总共有7个BeanPostProcessor
:
ApplicationContextAwareProcessor
ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor
PostProcessorRegistrationDelegate.BeanPostProcessorChecker
CommonAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
ApplicationListenerDetector