spring学习之源码分析--AbstractApplicationContext之refresh也提过了这个接口,这里用图解的方式重新看看这个接口。他这里有个方法,方法的参数是ConfigurableListableBeanFactory类型的。在这里我们可以分析和修改bean定义以及预实例化单例的工具。

@FunctionalInterface
public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
}

另外,还有一个接口,BeanDefinitionRegistryPostProcessor,继承了BeanFactoryPostProcessor接口,我们看看他的方法的参数,是BeanDefinitionRegistry类型的,在这里我们可以注册bean、移除bean等。

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

在refresh调用invokeBeanFactoryPostProcessors方法的时候,其实就是对上面两个接口的实现类的处理。

BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry

首先执行的是BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法,他的顺序如下:

  • 先调用继承了BeanDefinitionRegistryPostProcessor以及PriorityOrdered的子类,如果有多个实现了PriorityOrdered接口的类,那看order小的先执行。
  • 再调用继承了BeanDefinitionRegistryPostProcessor以及Ordered的子类,如果有多个实现了Ordered接口的类,那看order小的先执行。
  • 最后调用继承了BeanDefinitionRegistryPostProcessor的子类。

image.png

BeanDefinitionRegistryPostProcessor#postProcessBeanFactory

然后执行BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法,他的顺序同上。

BeanFactoryPostProcessor#postProcessBeanFactory

BeanDefinitionRegistryPostProcessor的子类执行完成后,这个时候才到BeanFactoryPostProcessor的子类执行postProcessBeanFactory方法,他的顺序如下:

  • 先调用继承了BeanFactoryPostProcessor以及PriorityOrdered的子类,如果有多个实现了PriorityOrdered接口的类,那看order小的先执行。
  • 再调用继承了BeanFactoryPostProcessor以及Ordered的子类,如果有多个实现了Ordered接口的类,那看order小的先执行。
  • 最后调用继承了BeanFactoryPostProcessor的子类。

image.png
以上就是BeanFactoryPostProcessor的调用过程,源码之前分析了这里就不做分析,你在实际生成中有用到这个接口吗,欢迎评论区讨论。


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆