BeanFactory 创建流程
获取 BeanFactory 子流程
时序图:
BeanDefinition 加载解析及注册子流程
该子流程涉及到如下几个关键步骤:
- Resource 定位:对 BeanDefinition 的资源定位过程,找到定义 JavaBean 信息的 XML文件,并将其封装成 Resource 对象。
- BeanDefinition 载入:把用户定义好的 JavaBean 表示为 IoC 容器内部的数据结构,这个容器内部的数据结构就是 BeanDefinition。
- 注册 BeanDefinition 到 IoC 容器
过程分析
-
子流程入口在 org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory 方法中。
-
依次调用多个类的 loadBeanDefinitions 方法 ->AbstractXmlApplicationContext -> AbstractBeanDefinitionReader -> XmlBeanDefinitionReader 一直执行到 XmlBeanDefinitionReader 的 doLoadBeanDefinitions 方法。
-
重点观察 XmlBeanDefinitionReader 类的 registerBeanDefinitions 方法,期间产生了多次重载调用,我们定位到最后一个。
此处关注两个地方:一个 createRederContext 方法,一个是 DefaultBeanDefinitionDocumentReader 类的 registerBeanDefinitions 方法,先进入 createRederContext 方法看看。
可以看到,此处 Spring 首先完成了 NamespaceHandlerResolver 的初始化。
再进入 registerBeanDefinitions 方法中追踪,调用了
DefaultBeanDefinitionDocumentReader#registerBeanDefinitions 方法。
进入 doRegisterBeanDefinitions 方法
进入 parseBeanDefinitions 方法
进入 parseDefaultElement 方法
进入 processBeanDefinition 方法
至此,注册流程结束,注册就是把封装的 XML 中定义的 Bean 信息封装为 BeanDefinition 对象之后放入一个 Map 中,BeanFactory 是以 Map 的结构组织这些 BeanDefinition 的。
可以在 DefaultListableBeanFactory 中看到此Map的定义