注:本系列源码分析基于spring 5.2.2.RELEASE,本文的分析基于 annotation 注解方式,gitee仓库链接:gitee.com/funcy/sprin….
1. 什么是 BeanFactoryPostProcessor
BeanFactoryPostProcessor 中文名叫 spring beanFactory 的后置处理器,可以用来定制化 beanFactory 的一些行为。
spring 为我们提供了两种 BeanFactoryPostProcessor:
org.springframework.beans.factory.config.BeanFactoryPostProcessor/** * beanFactory 的后置处理器,可以改变 beanFactory 的一些行为 */ public interface BeanFactoryPostProcessor { /** * 处理 beanFactory 的方法,参数为 beanFactory,实际类型是 DefaultListableBeanFactory */ void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; }org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor/** * BeanDefinition 注册器,从名称来看,就是用来注册 beanDefinition 的 * 继承了 BeanFactoryPostProcessor 接口, * 也可以重写 BeanFactoryPostProcessor#postProcessBeanFactory 方法 * */ public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor { /** * 1. 该方法先于 BeanDefinitionRegistryPostProcessor#postProcessBeanFactory 执行 * 2. 传入参数为 registry,实际类是 DefaultListableBeanFactory,也可以使用 beanFactory 的操作 */ void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException; }
BeanFactoryPostProcessor 在AbstractApplicationContext#invokeBeanFactoryPostProcessors方法中被执行,执行时先执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry,再执行BeanFactoryPostProcessor#postProcessBeanFactory,关于这块的分析,可以参考spring启动流程之执行BeanFactoryPostProcessor 一文。
2. BeanFactoryPostProcessor 提供的功能
本节我们来介绍BeanFactoryPostProcessor提供的功能。
2.1 BeanFactoryPostProcessor 的作用
探讨前,我们先来了解下 BeanFactoryPostProcessor 提供方法:
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException;
该方法中只有一个参数:ConfigurableListableBeanFactory,我们想了解BeanFactoryPostProcessor 能为我们做什么,需要知道这个参数提供了哪些功能:
我们先来看看它的set方法:
除此之外,还有register方法:
有了这些方法,我们就可以定制化beanFactory的一些行为了。
2.2 BeanDefinitionRegistryPostProcessor 的作用
我们也来了解下BeanDefinitionRegistryPostProcessor提供的方法:
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException;
这个方法的参数是BeanDefinitionRegistry,从字面意义来看,这是个BeanDefinition 注册器,它提供了如下方法:
可以看到,这个参数主要就是围绕BeanDefinition来操作,比较重要的方法列举如下:
BeanDefinitionRegistry#containsBeanDefinition:是否包含指定名称的BeanDefinitionBeanDefinitionRegistry#getBeanDefinition:获取指定名称的BeanDefinitionBeanDefinitionRegistry#registerBeanDefinition:注册一个BeanDefinitionBeanDefinitionRegistry#removeBeanDefinition:移除BeanDefinition
3. spring 提供的 BeanFactoryPostProcessor
spring 中一共有两个 BeanFactoryPostProcessor 的实现类,相关信息及作用如下:
-
EventListenerMethodProcessor:- 实现了
BeanFactoryPostProcessor,SmartInitializingSingleton接口 - 在
BeanDefinitionRegistryPostProcessor#postProcessBeanFactory方法中获取了EventListenerFactory - 在
SmartInitializingSingleton#afterSingletonsInstantiated方法中处理@EventListener注解
- 实现了
-
ConfigurationClassPostProcessor:- 在
AnnotationConfigUtils#registerAnnotationConfigProcessors(BeanDefinitionRegistry, Object)方法中注册 - 实现了
BeanDefinitionRegistryPostProcessor接口 - 处理
@Conditional注解 - 处理
@Component注解 - 处理
@PropertySource/@PropertySources注解 - 处理
@ComponentScan/@ComponentScans注解 - 处理
@Import注解 - 处理
@ImportResource注解 - 处理
@Bean注解 - 处理
@Configuration注解
- 在
关于EventListenerMethodProcessor处理@EventListener的分析,可以参考【spring源码分析】spring探秘之监听器注解 @EventListener.
关于ConfigurationClassPostProcessor处理各注解的流程,可以参考:
- ConfigurationClassPostProcessor(一):处理@ComponentScan注解
- ConfigurationClassPostProcessor(二):处理@Bean注解
- ConfigurationClassPostProcessor(三):处理@Import注解
- ConfigurationClassPostProcessor(四):处理@Conditional注解
4. 总结
本文介绍了BeanFactoryPostProcessor的概念,举例说明了BeanFactoryPostProcessor的使用,以及介绍了spring提供的两个BeanFactoryPostProcessor实现类:EventListenerMethodProcessor与ConfigurationClassPostProcessor。
本文原文链接:my.oschina.net/funcy/blog/… ,限于作者个人水平,文中难免有错误之处,欢迎指正!原创不易,商业转载请联系作者获得授权,非商业转载请注明出处。
本系列的其他文章