概述
本方法(invokeBeanFactoryPostProcessors)
会实例化和调用所有 BeanFactoryPostProcessor
(包括其子类BeanDefinitionRegistryPostProcessor
)。
BeanFactoryPostProcessor
接口是 Spring
初始化 BeanFactory
时对外暴露的扩展点,Spring
IoC 容器允许 BeanFactoryPostProcessor
在容器实例化任何 bean
之前读取 bean
的定义,并可以修改它。
BeanDefinitionRegistryPostProcessor
继承自 BeanFactoryPostProcessor
,比 BeanFactoryPostProcessor
具有更高的优先级,主要用来在常规的 BeanFactoryPostProcessor
检测开始之前注册其他 bean
定义。特别是,你可以通过 BeanDefinitionRegistryPostProcessor
来注册一些常规的 BeanFactoryPostProcessor
,因为此时所有常规的 BeanFactoryPostProcessor
都还没开始被处理。
项目中的实战
BeanDefinitionRegistryPostProcessor
初始化Bean
的例子
1 | // 想根据配置文件来动态的生成我们的Bean对象 |
BeanFactoryPostProcessor初始化的时候do something
1 | public class KeplerBeanFactoryPostInitializer implements BeanFactoryPostProcessor { |
跟进源代码
1 | protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { |
getBeanFactoryPostProcessors
1 | /** |
这边 getBeanFactoryPostProcessors()
会拿到当前应用上下文中已经注册的 BeanFactoryPostProcessor
,在默认情况下,this.beanFactoryPostProcessors
是返回空的。
1 | public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> { |
invokeBeanFactoryPostProcessors
1 | public static void invokeBeanFactoryPostProcessors( |
sortPostProcessors
1 | private static void sortPostProcessors(List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) { |
默认情况下,比较器为 OrderComparator
;如果配置了 annotation-config
,并且值为true
,使用的是 AnnotationAwareOrderComparator
,AnnotationAwareOrderComparator
继承自 OrderComparator
,只是重写了部分方法,比较器的部分代码如下:
1 |
|
总结
第一点:整个 invokeBeanFactoryPostProcessors
方法围绕两个接口,BeanDefinitionRegistryPostProcessor
和 BeanFactoryPostProcessor
,其中 BeanDefinitionRegistryPostProcessor
继承了 BeanFactoryPostProcessor
。BeanDefinitionRegistryPostProcessor
主要用来在常规 BeanFactoryPostProcessor
检测开始之前注册其他 Bean 定义,说的简单点,就是 BeanDefinitionRegistryPostProcessor
具有更高的优先级,执行顺序在 BeanFactoryPostProcessor
之前。
第二点:整个 invokeBeanFactoryPostProcessors
方法操作了 3 种 bean 对象:
- 入参
beanFactoryPostProcessors
:拿的是AbstractApplicationContext
类的beanFactoryPostProcessors
属性值,也就是在之前已经添加到beanFactoryPostProcessors
中的BeanFactoryPostProcessor
BeanDefinitionRegistryPostProcessor
接口实现类:实现了BeanDefinitionRegistryPostProcessor
接口,并且注册到Spring IoC
容器中。- 常规
BeanFactoryPostProcessor
接口实现类:实现了BeanFactoryPostProcessor
接口,并且注册到Spring IoC
容器中。
第三点:操作3种 bean 对象具体指的是调用它们重写的方法,调用实现方法时会遵循以下的优先级:
两个用于排序的重要接口:PriorityOrdered
和 Ordered
,其中 PriorityOrdered
继承了 Ordered
,并且 PriorityOrdered
的优先级要高于 Ordered
,这跟 BeanDefinitionRegistryPostProcessor
继承 BeanFactoryPostProcessor
有点类似。实现 Ordered
接口需要重写 getOrder
方法,返回一个用于排序的 order
值,order
值的范围为 Integer.MIN_VALUE ~ Integer.MAX_VALUE
,order
值越小优先级越高,Integer.MIN_VALUE
拥有最高优先级,而 Integer.MAX_VALUE
则对应的拥有最低优先级。
第四点:常见的 Java EE
相关的框架或者中间件,经常使用 BeanFactoryPostProcessor
来进行扩展,例如上面的 Mybatis
,因此了解 BeanFactoryPostProcessor
的原理会对之后理解其他中间件的原理有帮助。
参考地址
如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。如果想加入微信群的话一起讨论的话,请加管理员简栈文化-小助手(lastpass4u),他会拉你们进群。