IoC容器系列的设计与实现:BeanFactory和ApplicationContext

在Spring IoC容器的设计中,我们可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的基本功能,另一个是ApplicationContext应用上下文,它作为容器的高级而存在。应用上下文在简单容器的基础上增加了许多面向框架的特性,同时对应用环境做了许多适配。下面就对Spring IOC容器中这两个系列的设计与实现进行一个简单的分析。

1、Spring IoC容器系列

IoC容器为开发者提供管理对象之间的依赖关系提供了很多便利和基础服务。有许多IoC容器供开发者选择,SpringFramework的IoC核心就是其中一个,它是开源的。对IoC容器的使用者来说,我们经常接触到的BeanFactory和ApplicationContext都可以看成是容器的具体表现形式。如果深入到Spring的实现中去看我们通常所说的IoC容器,实际上代表的是一系列功能各异的容器产品,只是容器的功能有大有小,有各自的特点。

作为IoC容器,需要为它的具体实现指定基本的功能规范,这个功能规范的设计表现为接口类BeanFactory,它提供了IoC容器最基本的功能规范。

IoC容器系列的设计与实现:BeanFactory和ApplicationContext

IoC容器系列的设计与实现:BeanFactory和ApplicationContext

从上图可以看出,BeanFactory接口在继承体系中的地位,它是作为一个最基本的接口类出现在Spring的IoC 容器体系中的。

在这些Spring提供的基本IoC容器的接口定义和实现的基础上,Spring通过自定义BeanDefinition来管理基于Spring的应用中的各种对象以及它们之间的相互依赖关系。BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。IoC容器是用来管理对象依赖关系的,对IoC容器来说,BeanDefinition就是对依赖反转模式中管理的对象依赖关系的数据抽象,也是容器实现依赖反转功能的核心数据结构,依赖反转功能都是围绕对这个BeanDefinition的处理来完成的。

2、Spring IoC容器的设计

IoC容器系列的设计与实现:BeanFactory和ApplicationContextIoC容器系列的设计与实现:BeanFactory和ApplicationContextIoC容器系列的设计与实现:BeanFactory和ApplicationContext

上图为IoC容器的接口设计图,画的不是太美观。

3、IoC容器的初始化过程

简单的来说,IoC容器的初始化过程是由refresh() 方法来启动的,这个方法标志着IOC容器的正式启动。这个启动包括以下三个基本过程:

(1)BeanDefinition的Resource定位

(2)BeanDefinition的Resource载入

(3)BeanDefinition的Resource注册

第一个过程是Resource定位。这个Resource定位指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供统一的接口。比如,在文件系统中的Bean定义信息可以使用FileSystemResource来进行抽象;在类路径的Bean定义信息可以使用ClassPathResource。

第二个过程是想IoC容器注册这些BeanDefinition的过程。这个过程通过调用BeanDefinitionRegistry接口的实现来完成的。这个注册过程把载入过程中解析得到的BeanDefinition注入到一个HashMap中,IoC容器就是通过这个HashMap来持有这些BeanDefinition数据的。在Spring IoC的设计中,Bean的载入和依赖注入是两个独立的过程,依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候。Spring也提供给用户一个预实例化的配置,具体来说可以通过为Bean定义信息中的lazyinit属性,用户可以对容器初始化过程做一个微小的控制,从而改变这个被设置了lazyinit属性的Bean的依赖注入过程。如果对某个Bean做了lazyinit设置,那么这个Bean的注入在容器初始化的时候就完成了。

3.1 BeanDefinition的Resource定位

下面以FileSystemXmlApplicationContext为例,通过分析这个ApplicationContext的实现来看看它是怎样完成这Resource定位过程的。先列出FileSystemXmlApplicationContext继承体系关系,如下图:

IoC容器系列的设计与实现:BeanFactory和ApplicationContext