《spring技术内幕》系列二之ioc容器创建

我们可以认为直接的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");



图片发自App

参考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容器的基本功能之外,还提供了一系列扩展功能

图片发自App


正因为提供了这么多附加功能,一般建议在开发应用时使用ApplicationContext作为IoC容器的基本形式。

TODO:列出相对于简单ioc容器提供的附加功能

1.支持不同的信息源,通过扩展MessageSource接口,支持国际化功能

2.支持多资源访问。通过扩展ResourceLoader和Resource接口,支持从不同资源获取BeanDefinition信息。

3.支持应用事件(这很重要)。通过实现ApplicationEventPublisher接口,这样在上下文中引入了事件机制。这些事件和Bean的生命周期的结合为Bean的管理提供了便利。

4.ApplicationContext本身类提供的附加功能。

你可能感兴趣的:(《spring技术内幕》系列二之ioc容器创建)