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的定义。