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。

浙公网安备 33010602011771号