-
Spring的IoC容器
在spring IoC容器的设计中,有两个主要的容器系列,一个是实现了BeanFactory接口的简单容器系列,实现了BeanFactory的容器只实现了容器的最基本功能;另一个实现方式是ApplicationContext应用上下文,它在BeanFactory的基础上,增加了许多面向框架的特性,同时对应用环境做了很多适配,ApplicationContext作为容器的高级形态而存在。在spring framework的core下对IoC有如下的解释:
IoC容器为开发者提供了很多管理对象之间依赖关系的便利服务,在开发体系中有很多IoC容器让开发人员选择,spring framework的IoC核心就是其中非常著名的一个,它是一个开源的框架。
-
什么是IoC容器
IoC容器在Spring中是什么样子的呢,对于每一个开发者来说,在平时开发过程中接触到的BeanFactory和ApplicationContext都是容器的最终表现形式。如果去Spring底层实现来看,IoC容器在Spring中代表的是一系列功能各异的容器产品,只是容器的功能范围有所不同。
举个简单的例子,就拿我们使用最多的笔记本电脑来说,在电脑城出售的笔记本有各式各样的,而且制作的材料也是五花八门,但是就算有这么多样式的笔记本电脑,它也只能是一个电脑,要满足电脑的最基本特性,那就是计算。这个在Spring中也是一样的,Spring的IoC容器也提供了很多容器供开发者选择,使用什么样的容器完全由开发者选择,就像你买一个游戏机和买一个写文档的笔记本,对电脑的选择是完全不一样的。
下面是Spring中BeanFactory容器的概况:
就像笔记本电脑要有自己的产品规格一样,IoC容器也是一样,也需要为它的具体实现指定最基本的功能规范,这个功能规范的设计就是BeanFactory接口中定义的规范,在BeanFactory中的基本功能规范就是Spring为开发者提供的最基本功能。
我们以前面笔记本电脑的选择为例,如果将IoC看做是笔记本电脑,那BeanFactory就是定义了笔记本电脑作为电脑的基本功能,至少要能计算,除了这个功能,有游戏本、商务本等等,以满足不同用户的需求。但是不管什么类型的笔记本,它都需要有一项最基本的功能:计算。所以对于Spring的具体IoC实现来说,他需要满足的最基本特性就是BeanFactory接口的定义。
-
Spring的IoC容器如何管理对象的依赖关系
在上节中我们知道Spring是如何定位容器的基本能力,那么Spring在提供的基本IoC的基础上,Spring是通过定义BeanDefinition来管理基于Spring的应用中的各种对象以及相互依赖关系。BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。IoC容易是用来管理对象依赖关系的,BeanDefinition就是在依赖反转模式中对管理的对象依赖关系的数据抽象,也是容器实现依赖反转功能的核心数据结构,依赖反转的功能都是围绕对BeanDefinition的处理来完成。
-
Spring IoC容器的设计
在Spring中IoC容器是怎么设计的呢?下图是IoC容器中主要的接口设计。
从接口BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是一条主要的BeanFactory设计路径。在这条接口设计路径中,BeanFactory接口定义了基本的IoC容器的规范。在这个接口定义中,包括了getBean()这样的IoC容器最基本的方法。而HierarchicalBeanFactory和ConfigurableBeanFactory在实现了BeanFactory接口后,新增了一些其他的能力。
第二条设计路径是以ApplicationContext应用上下文接口为核心的接口设计,这里设计到的主要接口有从BeanFactory到ListableBeanFactory,再到ApplicationContext,再到常用的WebApplicationContext或者ConfigurableApplicationContext。
上图中涉及的是主要的接口关系,具体的IoC容器都是在这个接口体系下实现的。这个接口系统是以BeanFactory和ApplicationContext为核心的,从图中可以看出,BeanFactory是IoC容器的基本接口,在ApplicationContext的设计路径中,可以看到它继承了BeanFactory的其他实现接口,使ApplicationContext具备了BeanFactory的基本能力。另一方面,ApplicationContext通过实现其他接口,实现了更高级的IoC特性。
关于上面内容后面会单独用章节解读,这里只是对Spring容器设计思想上的一个简单解读,方便在全局对Spring的IoC容器有一个简单的认识。