工作内容
这个阶段是对用户自定义扩展的执行器进行调用。
目前已经有两个地方可以进行自定义的扩展:
- 在 ApplicationContext 配置阶段,通过 customizeContext 方法可以加入自定义执行器;
- 还有就是上个阶段 IOC 容器启动过程 4 - postProcessBeanFactory ()
扩展接口分为两类:
接口 | 说明 |
---|---|
BeanFactoryPostProcessor | 允许 BeanFactoryPostProcessor 读取到 BeanDefinition ,并可以修改它。 |
BeanDefinitionRegistryPostProcessor | 继承自 BeanFactoryPostProcessor,比 BeanFactoryPostProcessor 具有更高的优先级,主要用来在常规的 BeanFactoryPostProcessor 激活之前注册一些 bean 定义。 |
方法源码如下:
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory,
getBeanFactoryPostProcessors());
// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
if (beanFactory.getTempClassLoader() == null
&& beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
看到用户扩展的自定义执行器的方法交给了 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 去执行。
这里自定义扩展的执行器,它的执行是有一定的顺序:
首先自定义执行器定义的阶段:
- A阶段:在创建 ApplicationContext 时候注入的自定义执行器;这个阶段的执行器们最先执行;Spring5.2 源码学习 - IOC 容器启动过程 阶段上下文配置中
customizeContext(sc, wac)
注入的处理器。 - 其他阶段:其他地方通过接口注册的自定义执行器;
其执行顺序如下: