在Spring中,最基本的IOC容器接口是BeanFactory,上图可以看出XmlBeanFactory就是针对最基础的BeanFactory的IOC容器的实现。Spring提供了一个BeanFactory的基本实现,XmlBeanFactory同样的通过使用模板模式来得到对IOC容器的抽象,
AbstractBeanFactory,DefaultListableBeanFactory这些抽象类为其提供模板服务。其中通过resource 接口来抽象bean定义数据,对Xml定义文件的解析通过委托给XmlBeanDefinitionReader来完成。
这段代码演示了以下几个步骤:
1. 创建IOC配置文件的抽象资源
2. 创建一个BeanFactory
3. 把读取配置信息的BeanDefinitionReader,这里是XmlBeanDefinitionReader配置给BeanFactory
4. 从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成,这样完成整个载入bean定义的过程。我
们的IoC容器就建立起来了。
看源码可以知道读取器读取资源和注册bean定义信息的整个过程,ApplicationContext和XmlBeanFactory处理这些过程基本上是差不多的,那不同点在哪呢,BeanFactory往往不具备对资源定义的能力,而上下文可以自己完成资源定义。
ApplicationContext在BeanFactory基础上扩展而来,所以ApplicationContext具有BeanFactory的全部能力ApplicationContext
也有许多新功能
* 可以支持不同的信息源,我们看到ApplicationContext扩展了MessageSource
* 访问资源 , 体现在对ResourceLoader和Resource的支持上面,这样我们可以从不同地方得到bean定义资源
* 支持应用事件,继承了接口ApplicationEventPublisher,这样在上下文中引入了事件机制而BeanFactory是没有的。
ApplicationContext提供IoC容器的主要接口,在其体系中有许多抽象子类比如AbstractApplicationContext为具体的BeanFactory的实现,比如FileSystemXmlApplicationContext和 ClassPathXmlApplicationContext提供上下文的模板,使得他们只需要关心具体的资源定位问题。当应用程序代码实例化 FileSystemXmlApplicationContext的时候,得到IoC容器的一种具体表现 - ApplicationContext,从而应用程序通过ApplicationContext来管理对bean的操作。
参考资料:《Spring技术内幕 - 深入解析Spring架构与设计原理》 ,spring源码。