Spring框架的设计理念与设计模式分析

2020-02-21 22:17

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的配置文件中你定义的节点中的所有信息,包括各种子节点。当Spring成功解析你定义的一个节点后,在Spring的内部它就被转化成了BeanDefination对象,以后所有的操作都是对这个对象完成的。

Bean的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。Bean的解析主要是对Spring配置文件的解析。这个解析过程主要是通过下图中的类完成:


Spring框架的设计理念与设计模式分析.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:留学生求职除了排队交简历,春招 Career Fair 上你还该做什么?

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: