我们可以认为直接的BeanFactory实现是IoC容器的基本形式,而各种ApplicationContext的实现是IoC容器的高级表现形式。关于ApplicationContext的分析,以及它与BeanFactory相比的增强特性都会在下面进行详细的分析。
就先拿一个直接的XmlBeanFactory实现来熟悉
容器继承体系
这是一个功能完备的ioc容器,名字里透露出来的信息就知道它可以从xml文件中解析BeanDefinition,继承自DefaultListableBeanFactory,
xml文件中定义的具体BeanDefinition信息如何解析呢,当然是交给一个专业的xml处理器XmlBeanDefini-tionReader类处理啦
那么问题来了,既然需要xml文件,那么如何知道来源呢?spring提供了一个工具类Resource类来分装io操作,常见的实现有我们熟悉的ClassPathResource类。作为XmlBeanFactory的一个构造参数传入进来,这样子信息源就有了,下面就开始解析这个信息源吧
ClassPathResource res = new ClassPathResource("beans.xml");
参考XmlBeanFactory实现,可以直接利用基类DefaultListableBeanFactory加载xml文件的基本过程
代码清单2-3编程式使用IoC容器
ClassPathResource res = new ClassPathResource("beans.xml");
DefaultListableBeanFactory
factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
通过factory对象来使用DefaultListableBeanFactory这个IoC容器了。创建IoC容器大概需要如下几个步骤:
1)创建IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息。
2)创建一个BeanFactory,这里使用DefaultListableBeanFactory。
3)创建一个载入BeanDefinition的读取器,这里使用XmlBeanDefinitionReader来载入XML文件形式的BeanDefinition,通过一个回调配置给BeanFactory。
4)从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。完成整个载入和注册Bean定义之后,需要的IoC容器就建立起来了。这个时候IoC容器就可以直接使用了。
2.2.3 ApplicationContext容器的特点
我们开发过程中最常用的ApplicationContext容器除了提供ioc容器的基本功能之外,还提供了一系列扩展功能
正因为提供了这么多附加功能,一般建议在开发应用时使用ApplicationContext作为IoC容器的基本形式。
TODO:列出相对于简单ioc容器提供的附加功能
1.支持不同的信息源,通过扩展MessageSource接口,支持国际化功能
2.支持多资源访问。通过扩展ResourceLoader和Resource接口,支持从不同资源获取BeanDefinition信息。
3.支持应用事件(这很重要)。通过实现ApplicationEventPublisher接口,这样在上下文中引入了事件机制。这些事件和Bean的生命周期的结合为Bean的管理提供了便利。
4.ApplicationContext本身类提供的附加功能。