spring 如何注入bean的后置处理器?
一、准备工作 AbstractApplicationContext#prepareBeanFactory 对bean工厂进行填充属性 增加beanPostProcessors (ApplicationContextAwareProcessor,ApplicationListenerDetector)
二、PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors 方法调用 1.AbstractApplicationContext#getBeanFactoryPostProcessors 获取实现了BeanFactoryPostProcessor接口的bean工厂的后置处理器,遍历执行处理器的postProcessBeanDefinitionRegistry方法,检测beanFactory后置处理器是否实现了postProcessBeanDefinitionRegistry接口 此接口可以直接注册beanDefinition或者其他对beanDefinition操作
2.DefaultListableBeanFactory#getBeanNamesForType() 根据参数type获取beanDefinitionNames中符合条件得bean以及手动注册得单例manualSingletonNames 中符合条件(BeanDefinitionRegistryPostProcessor)的bean,按照PriorityOrdered -》Ordered-》普通 顺序执行注册bean定义的后置处理器方法BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry
3. PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors 遍历所有的 1,2步记录的所有的实现了BeanPostProcess的bean,执行postProcessBeanFactory 可对于bean属性设置等操作
4. 重复DefaultListableBeanFactory#getBeanNamesForType() 获取BeanFactoryPostProcessor.class 类型的所有bean,按照PriorityOrdered -》Ordered-》普通顺序执行bean的postProcessBeanFactory方法
三、总结 获取实现 BeanFactoryPostProcessor接口的bean,执行其postProcessBeanDefinitionRegistry 方法 可以自定义处理工厂的bean,如 ConfigurationClassPostProcessor 实现了postProcessBeanDefinitionRegistry方法 会解析@Configuration等逻辑;
获取实现了BeanFactoryPostProcessor.class 的所有bean 排序后执行其postProcessBeanFactory方法,注册bean定义以及自定义处理bean工厂的属性;