上一篇文章我们分析了invokeBeanFactoryPostProcessors方法中BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor这两个接口发挥的作用。紧接着,Spring调用了registerBeanPostProcessors接口在上下文中注册BeanPostProcessor。这篇文章我们来分析一下BeanPostProcessor接口发挥的作用。
首先看一下BeanPostProcessor定义的翻译:
1 | /** |
registerBeanPostProcessors
接着再来看registerBeanPostProcessors方法的工作,它直接委托给PostProcessorRegistrationDelegate.registerBeanPostProcessors方法来执行。
首先调用beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false)来获取所有匹配BeanPostProcessor的类名。默认情况下能获得三个类名:
org.springframework.context.annotation.internalAutowiredAnnotationProcessororg.springframework.context.annotation.internalRequiredAnnotationProcessororg.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:
ApplicationContextAwareProcessorApplicationListenerDetectorConfigurationClassPostProcessor.ImportAwareBeanPostProcessor
其中:ApplicationContextAwareProcessor和ApplicationListenerDetector是在prepareBeanFactory方法中加入的。ImportAwareBeanPostProcessor是调用ConfigurationClassPostProcessor的postProcessBeanFactory方法是加入的。
接着将这三个BeanPostProcessor按顺序注册到beanFactory中,添加在beanFactory的beanPostProcessors列表的末尾。
最后再注册一个ApplicationListenerDetector到beanFactory中,由于ApplicationListenerDetector已经存在于beanFactory的beanPostProcessors列表中,所以这里是先将原来的ApplicationListenerDetector删除然后在beanPostProcessors列表的末尾加入新的ApplicationListenerDetector。
registerBeanPostProcessors方法执行完成之后,beanFactory的beanPostProcessors列表中总共有7个BeanPostProcessor:
ApplicationContextAwareProcessorConfigurationClassPostProcessor.ImportAwareBeanPostProcessorPostProcessorRegistrationDelegate.BeanPostProcessorCheckerCommonAnnotationBeanPostProcessorAutowiredAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessorApplicationListenerDetector