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的子类。
BeanDefinitionRegistryPostProcessor#postProcessBeanFactory
然后执行BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法,他的顺序同上。
BeanFactoryPostProcessor#postProcessBeanFactory
BeanDefinitionRegistryPostProcessor的子类执行完成后,这个时候才到BeanFactoryPostProcessor的子类执行postProcessBeanFactory方法,他的顺序如下:
- 先调用继承了BeanFactoryPostProcessor以及PriorityOrdered的子类,如果有多个实现了PriorityOrdered接口的类,那看order小的先执行。
- 再调用继承了BeanFactoryPostProcessor以及Ordered的子类,如果有多个实现了Ordered接口的类,那看order小的先执行。
- 最后调用继承了BeanFactoryPostProcessor的子类。
以上就是BeanFactoryPostProcessor的调用过程,源码之前分析了这里就不做分析,你在实际生成中有用到这个接口吗,欢迎评论区讨论。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。