Spring框架的设计理念与设计模式分析
摘要:本文试图剖析出Spring框架的作者设计Spring框架的骨骼结构的设计理念,有哪几个核心组件?为什么需要这些组件?它们又是如何结合在一起构成Spring的骨骼架构?Spring的AOP特性又是如何利用这些基础的骨骼架构来工作的?Spring中又使用了哪些设计模式来完成它的这种设计?它的这种设计理念对我们以后的软件设计有何启示?本文将解答这些问题
一、 Spring的骨骼架构
Spring总共有十几个组件,但真正核心的组件只有几个,下面是Spring框架的总体架构图
图1 .Spring 框架的总体架构图
从图中可以看出,Spring框架中的核心组件只有三个:Context,Core和Beans,它们构建起了整个Spring的骨骼架构。没有它们就不可能有AOP,Web等上层的特性功能。下面也将主要从这三个组件入手分析Spring
1. Spring的设计理念
前面介绍了Spring的三个核心组件,如果再在它们三个之中选出一个核心的话,那就非Beans组件莫属了。为何这样说,其实Spring就是面向Bean的编程(BOP,Bean Oriented Programming),Bean在Spring中才是真正的主角。
Bean在Spring中的作用就像 Object对OOP的意义一样,没有对象的概念就没有面向对象编程,Spring中没有Bean也就没有了Spring存在的意义。就像演出舞台都准备好了但是却没有演员一样。为什么Bean如此重要,这是由Spring的设计目标决定的。Spring为何如此流行,我们使用Spring的原因是什么,想想你会发现原来Spring解决了一个非常关键的问题:它可以让你把对象间的依赖关系转而用配置文件来管理,也就是它的依赖注入机制。而这个注入关系在一个叫IOC的容器中管理,IOC容器存的就是被Bean包裹的对象。Spring正是通过把对象包装在Bean中来达到对这些对象管理以及额外操作的目的。
它的这种设计策略完全类似于Java实现OOP的设计理念,当然了Java本身的设计要比Spring复杂太多太多,但是都是构建一个数据结构,然后根据这个数据结构设计它的生存环境,并让它在这个生存环境中按照一定的规律在不停的运动。在它们的不停运动中设计一系列与环境或者其他个体完成信息交换。回头想想其他框架都是类似的设计理念。
2. 核心组件如何协同工作
前面说Bean是Spring中的关键因素,那么Core和Context又有何作用呢?前面把Bean比作一场演出中的演员,那么Context就是舞台背景,Core就是演出的道具。只有它们在一起才能具备演出一场好戏的基本条件。当然有最基本的条件还不能使这场戏脱颖而出,还要它表演的界面足够精彩,这些节目就是Spring能提供的特色功能了。
我们知道Bean包装的是Object,而Object必然有数据,如何给这些数据提供生存环境就是Context要解决的问题,对Context来说它就是要发现每个Bean之间的关系,为它们建立这种关系并维护好这种关系。所以Context就是一个Bean关系的集合,这个关系集合又叫IOC容器。一旦建立起这个IOC容器之后,Spring就可以为你工作了。那么Core组件又有何用武之地呢?其实Core就是发现,建立和维护Bean之间的关系所需要的一系列工具,从这个角度看Core这个组件叫Util能更让你理解。
它们之间的关系如下图所示:
图2. 三个组件关系
3. 核心组件详解
这里将详细介绍每个组件内部类的层次关系,以及它们在运行时的时序顺序,我们在使用Spring时应该注意的地方。
3.1 Bean组件
前面已经说明了Bean组件对Spring的重要性,下面看看Bean这个组件是怎么设计的。Bean组件在Spring的org.springframework.beans包下。这个包下的所有类主要解决了三件事:Bean的定义,Bean的创建以及对Bean的解析。对Spring的使用者来说唯一需要关心的就是Bean的创建,其他两个由Spring在内部帮你完成了,对你来说是透明的。
Spring Bean的创建是典型的工厂模式,它的顶级接口是BeanFactory,下图是这个工厂的继承层次关系:
图4. Bean工厂的继承关系
BeanFactory有三个子类:ListableBeanFactory,HierarchicalBeanFactory和AutowireCapatableBeanFactory。但是从上图我们可以发现最终的默认实现类是
DefaultListableBeanFactory,它实现了所有的接口。那么为何要定义这么多层次的接口呢?查阅这些层次的源码和说明发现,每个接口都有它使用的场合,它主要是为了区分Spring内部操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。例如ListableBeanFactory接口表示这些Bean是可列表的;而HierarchicalBeanFactory接口表示这些Bean是有继承关系的,也就是说每个Bean都可能有父Bean;AutowireCapatableBeanFactory接口定义Bean的自动装配规则。这四个接口共同定义了Bean的集合,Bean之间的关系,以及Bean的行为。
Bean的定义主要有BeanDefination描述,下图说明了这些类的层次关系:
图5. Bean定义的类层次关系图
Bean的定义就是完整的描述了在Spring的配置文件中你定义的
Bean的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。Bean的解析主要是对Spring配置文件的解析。这个解析过程主要是通过下图中的类完成: