spring组件之 BeanFactoryPostProcessor

132 阅读3分钟

注:本系列源码分析基于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;
    
    }
    

BeanFactoryPostProcessorAbstractApplicationContext#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:是否包含指定名称的BeanDefinition
  • BeanDefinitionRegistry#getBeanDefinition:获取指定名称的BeanDefinition
  • BeanDefinitionRegistry#registerBeanDefinition:注册一个BeanDefinition
  • BeanDefinitionRegistry#removeBeanDefinition:移除BeanDefinition

3. spring 提供的 BeanFactoryPostProcessor

spring 中一共有两个 BeanFactoryPostProcessor 的实现类,相关信息及作用如下:

  • EventListenerMethodProcessor

    • 实现了BeanFactoryPostProcessorSmartInitializingSingleton 接口
    • 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处理各注解的流程,可以参考:

4. 总结

本文介绍了BeanFactoryPostProcessor的概念,举例说明了BeanFactoryPostProcessor的使用,以及介绍了spring提供的两个BeanFactoryPostProcessor实现类:EventListenerMethodProcessorConfigurationClassPostProcessor


本文原文链接:my.oschina.net/funcy/blog/… ,限于作者个人水平,文中难免有错误之处,欢迎指正!原创不易,商业转载请联系作者获得授权,非商业转载请注明出处。

本系列的其他文章

【spring源码分析】spring源码分析系列目录