一. BeanFactory
1. 在 spring 中,最基本的 IOC 容器接口是 BeanFactory-这个接口为具体的 IOC 容器的实现 做了最基本的功能规定。
2. 在 BeanFactory 只对 IOC 容器的基本行为做了定义,根本不关心你的 bean 是怎样定义怎 样加载的;XmlBeanFactory 就是针对最基础的 BeanFactory 的 IOC 容器的实现。这个实现就 是用 xml 文件来定义 IOC 容器中的 bean。
3. Spring 提供了 BeanFactory 的基本实现。XmlBeanFactory 同样通过使用模版模式来得到 IOC 容器的抽象,AbstractBeanFactory, DefaultListableBeanFactory 这些抽象类为其提 供模板服务。其中通过 resource 接口来抽象 bean 定义数据。对 Xml 定义文件的解析通过委托给 XmlBeanDefinitionReader 来完成。
下面简单的演示 IOC 容器的创建过程:
这些代码演示了以下几个步骤:
1)创建 IOC 配置文件的抽象资源
2)创建一个 BeanFactory
3)把读取配置信息的 BeanDefinitionReader,这是 XmlBeanDefinitionReader 配置给 beanFactory;
4)从定义好的资源位置读取配置文件,具体的解析过程交由 XmlBeanDefinitionReader 来完成;这样就完成了整个载入 bean 的过程,我们的 IOC 容器就建立起来了。
二.BeanFactory 与上下文这两种 IOC 容器的区别:
1)BeanFactory 与上下文在读取器读取资源和注册 bean 定义信息的整个过程的处理是一样 的。
2)BeanFactory 往往不具备对资源定义的能力,而上下文可以自己完成资源定义。
三.ApplicationContext
1. ApplicationContext 提供了 IOC 容器的主要接口。在其体系中有许多抽象子类比如 AbstractApplicationContext 为具体的 BeanFactory 的实现,比如FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext 提供上下文的 模板,使得他们只需要关心具体的资源定位问题。
2. 当应用程序代码实例化 FileSystemXmlApplicationContext 的时候。我们得到 IOC 容器 的一种具体的体现-ApplicationContext,从而应用程序通过 ApplicationContext 来管理对 bean 的操作。
总结 IOC 容器的初始化步骤:
1. 初始化的入口在容器实现中的 refresh() 调用来完成
2. 对 bean 定义载入 IOC 容器使用的方法是 loadBeanDefinition, 其中的大致过程如下: 通过 ResourceLoader 来完成资源文件位置的定位,DefaultResourceLoader 是默认的实现, 同时上下文本身就给出了 ResourceLoader 的实现,可以从类路径,文件系统, URL 等方式 来定为资源位置。如果是 XmlBeanFactory 作为 IOC 容器,那么需要为它指定 bean 定义的资 源,也就是说 bean 定义文件时通过抽象成 Resource 来被 IOC 容器处理的,容器通过 BeanDefinitionReader 来完成定义信息的解析和 Bean 信息的注册,往往使用的是 XmlBeanDefinitionReader 来解析 bean 的 xml 定义文件 - 实际的处理过程是委托给 BeanDefinitionParserDelegate 来完成的,从而得到 bean 的定义信息,这些信息在 Spring 中使用 BeanDefinition 对 象 来 表 示 - 这 个 名 字 可 以 让 我 们 想 到 loadBeanDefinition,registerBeanDefinition 这 些相 关的 方法 - 他们 都是 为处 理 BeanDefinitin 服务的,IoC 容器解析得到 BeanDefinition 以后,需要把它在 IOC 容器中 注册,这由 IOC 实现 BeanDefinitionRegistry 接口来实现。注册过程就是在 IOC 容器内 部维护的一个 HashMap 来保存得到的 BeanDefinition 的过程。这个 HashMap 是 IoC 容器持 有 bean 信息的场所,以后对 bean 的操作都是围绕这个 HashMap 来实现的。