获取 BeanFactory 流程

时序图
获取BeanFactory流程时序图

BeanDefinition 加载解析及注册子流程

该子流程涉及到如下几个关键步骤

  1. Resource 定位:对 BeanDefinition 的资源定位过程,找到定义 JavaBean 信息的 XML文件,并将其封装成 Resource 对象。
  2. BeanDefinition 载入:把用户定义好的 JavaBean 表示为 IoC 容器内部的数据结构,这个容器内部的数据结构就是 BeanDefinition。
  3. 注册 BeanDefinition 到 IoC 容器

过程分析

  1. 子流程入口在 org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory 方法中。
    获取BeanFactory流程-过程分析

  2. 依次调用多个类的 loadBeanDefinitions 方法 ->AbstractXmlApplicationContext -> AbstractBeanDefinitionReader -> XmlBeanDefinitionReader ​ 一直执行到 XmlBeanDefinitionReader 的 doLoadBeanDefinitions 方法。

  3. 重点观察 XmlBeanDefinitionReader 类的 registerBeanDefinitions 方法,期间产生了多次重载调用,我们定位到最后一个。

    此处关注两个地方:一个 createRederContext 方法,一个是 DefaultBeanDefinitionDocumentReader 类的 registerBeanDefinitions 方法。

  4. 先进入 createRederContext 方法看看。

    可以看到,此处 Spring 首先完成了 NamespaceHandlerResolver 的初始化。\

  5. 再进入 registerBeanDefinitions 方法中追踪,调用了 DefaultBeanDefinitionDocumentReader#registerBeanDefinitions 方法。

    进入 doRegisterBeanDefinitions 方法

    进入 parseBeanDefinitions 方法

    进入 parseDefaultElement 方法

    进入 processBeanDefinition 方法

  6. 至此,注册流程结束,注册就是把封装的 XML 中定义的 Bean 信息封装为 BeanDefinition 对象之后放入一个 Map 中,BeanFactory 是以 Map 的结构组织这些 BeanDefinition 的。

    可以在 DefaultListableBeanFactory 中看到此Map的定义。

BeanDefinition 加载解析及注册子流程时序图