
这段代码是 Spring 中编程式使用 IOC 容器,经过这四段简单的代码,咱们能够初步判断 IOC 容器的使用过程编程
- 获取资源
- 获取 BeanFactory
- 根据新建的 BeanFactory 建立一个BeanDefinitionReader对象,该Reader 对象为资源的解析器
- 装载资源
整个过程就分为三个步骤:资源定位、装载、注册数据结构
- 资源定位:咱们通常用外部资源来描述 Bean 对象,因此在初始化 IOC 容器的第一步就是须要定位这个外部资源
- 装载:装载就是 BeanDefinition 的载入。BeanDefinitionReader 读取、解析 Resource 资源,也就是将用户定义的 Bean 表示成 IOC 容器的内部数据结构:BeanDefinition。在 IOC 容器内部维护着一个 BeanDefinition Map 的数据结构,在配置文件中每个 <bean> 都对应着一个BeanDefinition对象
- 注册:向IOC容器注册在第二步解析好的 BeanDefinition,这个过程是经过 BeanDefinitionRegistery 接口来实现的。在 IOC 容器内部实际上是将第二个过程解析获得的 BeanDefinition 注入到一个 HashMap 容器中,IOC 容器就是经过这个 HashMap 来维护这些 BeanDefinition 的。
- 须要注意的一点是这个过程并无完成依赖注入,依赖注册是发生在应用第一次调用
getBean()
向容器索要 Bean 时
- 固然咱们能够经过设置预处理,即对某个 Bean 设置 lazyinit 属性,那么这个 Bean 的依赖注入就会在容器初始化的时候完成
reader.loadBeanDefinitions(resource)
才是加载资源的真正实现编码
- 从指定的 xml 文件加载 Bean Definition,这里会先对 Resource 资源封装成 EncodedResource
- 主要是为了对 Resource 进行编码,保证内容读取的正确性
- 经过
resourcesCurrentlyBeingLoaded.get()
来获取已经加载过的资源
- 而后将 encodedResource 加入其中,若是 resourcesCurrentlyBeingLoaded 中已经存在该资源,则抛出 BeanDefinitionStoreException 异常
- 完成后从 encodedResource 获取封装的 Resource 资源并从 Resource 中获取相应的 InputStream ,最后将 InputStream 封装为 InputSource 调用
doLoadBeanDefinitions()
方法 doLoadBeanDefinitions()
为从 xml 文件中加载 Bean Definition 的真正逻辑code
- 调用
doLoadDocument()
方法,根据 xml 文件获取 Document 实例
- 根据获取的 Document 实例注册 Bean 信息
- 其实在
doLoadDocument()
方法内部还获取了 xml 文件的验证模式
- 调用
getValidationModeForResource()
获取指定资源(xml)的验证模式

因此 doLoadBeanDefinitions()
主要就是作了三件事情xml
- 调用
getValidationModeForResource()
获取 xml 文件的验证模式
- 调用
loadDocument()
根据 xml 文件获取相应的 Document 实例。
- 调用
registerBeanDefinitions()
注册 Bean 实例。