Spring源码学习(四)

Spring源码学习之开篇一张图内容全靠编

Posted by GuiLing on July 20, 2019

Sring源码解析(四)

在上篇中已经完成了BeanFactory的准备工作,给BeanFactory添加了gezhog各种属性和上下文。
下面要开始执行BeanFactory的后置处理器了,在准备完成后Spring给我们提供了一个添加后置处理逻辑的方postProcessBeanFactory(beanFactory)这个方法是提供给子类去实现的,目的是在BeanFactory准备工作完成之后,进行一些自定义的后置操作。接下来就要激活并执行BeanFactory的后置处理器了invokeBeanFactoryPostProcessors(beanFactory);在这里执行了BeanFactory的所有货值处理器。获取所有的BeanFactoryPostProcessor执行,在执行之前我们先来看一下BeanFactoryPostProcessor的类结构图:

BeanFactoryPostProcess有一个子接口BeanDefinitionRegistryPostProcessor 因此在执行后置处理器时Spring先执行了实现了BeanDefinitionRegistryPostProcessor的后置处理器。

在这里先判断了BeanFactory的类型,并转换为BeanDefinitionRegistry因为实现了BeanDefinitionRegistryPostProcessor接口的后置处理器只对BeanDefinitionRegistry类型的BeanFactory起作用在此方法中传入的BeanFactory的类型是DefaultListableBeanFactory

在执行后置处理器的过程中创建了三个容器:

  • registryPostProcess用来记录通过硬编码方式注册的BeanDefinitionRegistryPostProcessor
  • regularPostProcessors用来记录通过硬编码方式注册的BeanFactoryPostProcessors
  • registryPostProcessorBeans记录通过配置方式注册的BeanDefinitionRegistryPostProcessor

这里需要注意的是对于手动注册的后置处理器Spring 在执行过程中并不保证器顺序,但是在配置文件中读取到的后置处理器Spring的执行顺序通过PriorityOrder和Order的优先级来保证,即先执行实现了PriorityOrder接口的后置处理器,然后执行实现了Order接口的后置处理器,最后执行没有实现任何接口的后置处理器。执行完BeanDefinitionRegistryPostProcessor 类型的后置处理器之后开始执行
BeanFactoryPostProcessors的后置处理器,执行的顺序和BeanDefinitionRegistryPostProcessor 的顺序相同。