工作内容

这个阶段是对用户自定义扩展的执行器进行调用。

目前已经有两个地方可以进行自定义的扩展:

  1. 在 ApplicationContext 配置阶段,通过 customizeContext 方法可以加入自定义执行器;
  2. 还有就是上个阶段 IOC 容器启动过程 4 - postProcessBeanFactory ()

扩展接口分为两类:

接口 说明
BeanFactoryPostProcessor 允许 BeanFactoryPostProcessor 读取到 BeanDefinition ,并可以修改它。
BeanDefinitionRegistryPostProcessor 继承自 BeanFactoryPostProcessor,比 BeanFactoryPostProcessor 具有更高的优先级,主要用来在常规的 BeanFactoryPostProcessor 激活之前注册一些 bean 定义。

方法源码如下:
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

  1. protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
  2. PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory,
  3. getBeanFactoryPostProcessors());
  4. // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
  5. // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
  6. if (beanFactory.getTempClassLoader() == null
  7. && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
  8. beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
  9. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
  10. }
  11. }

看到用户扩展的自定义执行器的方法交给了 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors 去执行。
这里自定义扩展的执行器,它的执行是有一定的顺序:
首先自定义执行器定义的阶段:

  1. A阶段:在创建 ApplicationContext 时候注入的自定义执行器;这个阶段的执行器们最先执行;Spring5.2 源码学习 - IOC 容器启动过程 阶段上下文配置中customizeContext(sc, wac)注入的处理器。
  2. 其他阶段:其他地方通过接口注册的自定义执行器;

其执行顺序如下: IOC 容器启动过程 5 - invokeBeanFactoryPostProcessors () - 图1