BeanFactoryPostProcessor

这个接口就是对 DefaultListableBeanFactory 容器进行配置的;虽然是对 DefaultListableBeanFactory 进行配置,但是只有在使用 ApplicationContext 容器的时候,这个接口的实例才会被调用。有的文章中会有 BFPP,它是这个接口的简写

由于参数是 DefaultListableBeanFactory,所以你可以做任何修改,例如添加属性编辑器、处理 BeanDefinition 等等(修改 BeanDefinition 比较多)。

public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

该接口下有一个子接口,会传递 BeanDefinitionRegistry 实例作为参数:

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
    void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}

虽然你通过 DefaultListableBeanFactory 实例一样能够注册 BeanDefinition,但是 Spring 规定在 BeanFactoryPostProcessor 开始之前注册 BeanDefinition。为什么这么规定,我也没有搞清楚。

注册实例到容器

向容器中注册 BeanFactoryPostProcessor 实例有两种方式,第一种方式就是将实现类注册为 Bean(有的也叫内部),第二种方式如下:

public abstract class AbstractApplicationContext extends DefaultResourceLoader
        implements ConfigurableApplicationContext {

    private final List<BeanFactoryPostProcessor> beanFactoryPostProcessors = new ArrayList<>();

    public void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor) {
        this.beanFactoryPostProcessors.add(postProcessor);
    }

显示调用 addBeanFactoryPostProcessor 方法注册(有的也叫外部 BeanFactoryPostProcessor)。

实例的执行

当 ApplicationContext 容器启动时,在创建 Bean 实例之前,会执行以下方法:

外部 BeanFactoryPostProcessor 和子类的执行顺序是按照添加顺序执行的,会忽略 PriorityOrdered 和 Ordered。

posted @ 2022-06-15 22:02  不是很聪明  阅读(22)  评论(0)    收藏  举报