没有合适的资源?快使用搜索试试~ 我知道了~
详细介绍Spring设计理念,深入了解Spring的处理过程
资源详情
资源评论
资源推荐
Spring 作为现在最优秀的框架之一,已被广泛的使用,51CTO 也曾经针对 Spring 框架中的 JDBC 应用做过
报道。本文将从另外一个视角试图剖析出 Spring 框架的作者设计 Spring 框架的骨骼架构的设计理念。
Rod Johson 在 2002 年编著的《Expert one to one J2EE design and development》一书中,对 Java
EE 正统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新之道。以此书为指导思想,
他编写了 interface21 框架,这是一个力图冲破 Java EE 传统开发的困境,从实际需求出发,着眼于轻便、
灵巧,易于开发、测试和部署的轻量级开发框架。Spring 框架即以 interface21 框架为基础,经过重新设
计,并不断丰富其内涵,于 2004 年 3 月 24 日,发布了 1.0 正式版。同年他又推出了一部堪称经典的力作
《Expert one-to-one J2EE Development without EJB》,该书在 Java 世界掀起了轩然大波,不断改变着
Java 开发者程序设计和开发的思考方式。在该书中,作者根据自己多年丰富的实践经验,对 EJB 的各种笨
重臃肿的结构进行了逐一的分析和否定,并分别以简洁实用的方式替换之。至此一战功成,Rod Johnson
成为一个改变 Java 世界的大师级人物。
传统 J2EE 应用的开发效率低,应用服务器厂商对各种技术的支持并没有真正统一,导致 J2EE 的应用
没有真正实现 Write Once 及 Run Anywhere 的承诺。Spring 作为开源的中间件,独立于各种应用服务器,
甚至无须应用服务器的支持,也能提供应用服务器的功能,如声明式事务等。
Spring 致力于 J2EE 应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说 Spring 是企业
应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring 并不想取代那些已有的框架,
而与它们无缝地整合。
Spring 简介
Spring 是一个开源框架,它由 Rod Johnson 创建。它是为了解决企业应用开发的复杂性而创建的。Spring
使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开
发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的 JavaBean 代替 EJB,并提供了更多的企业应用功能
◆范围:任何 Java 应用
简单来说,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
◆轻量——从大小与开销两方面而言 Spring 都是轻量的。完整的 Spring 框架可以在一个大小只有 1MB 多
的 JAR 文件里发布。并且 Spring 所需的处理开销也是微不足道的。此外,Spring 是非侵入式的:典型地,
Spring 应用中的对象不依赖于 Spring 的特定类。
◆控制反转——Spring 通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了 IoC,一个对象依赖
的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为 IoC 与
JNDI 相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
◆面向切面——Spring 提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例
如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻
辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
◆容器——Spring 包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的
每个 bean 如何被创建——基于一个可配置原型(prototype),你的 bean 可以创建一个单独的实例或者每
次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring 不应该被混同于传统的重量
级的 EJB 容器,它们经常是庞大与笨重的,难以使用。
◆框架——Spring 可以将简单的组件配置、组合成为复杂的应用。在 Spring 中,应用对象被声明式地组
合,典型地是在一个 XML 文件里。Spring 也提供了很多基础功能(事务管理、持久化框架集成等等),将
应用逻辑的开发留给了你。
所有 Spring 的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为 Spring 中的
各种模块提供了基础支持。
为什么需要 Spring
你可能正在想“Spring 不过是另外一个的 framework”。当已经有许多开放源代码(和专有) J2EE
framework 时,我们为什么还需要 Spring Framework?
Spring 是独特的,因为若干个原因:
◆它定位的领域是许多其他流行的 framework 没有的。Spring 关注提供一种方法管理你的业务对象。
◆ Spring 是全面的和模块化的。Spring 有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它
的架构仍然是内在稳定的。因此从你的学习中,你可得到最大的价值。例如,你可能选择仅仅使用 Spring
来简单化 JDBC 的使用,或用来管理所有的业务对象。
◆它的设计从底部帮助你编写易于测试的代码。Spring 是用于测试驱动工程的理想的 framework。
Spring 对你的工程来说,它不需要一个以上的 framework。Spring 是潜在地一站式解决方案,定位于
与典型应用相关的大部分基础结构。它也涉及到其他 framework 没有考虑到的内容。
Spring 带给我们什么
◆方便解耦,简化开发,通过 Spring 提供的 IoC 容器,我们可以将对象之间的依赖关系交由 Spring 进行控
制,避免硬编码所造成的过度程序耦合。有了 Spring,用户不必再为单实例模式类、属性文件解析等这些
很底层的需求编写代码,可以更专注于上层的应用。
◆AOP 编程的支持
通过 Spring 提供的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过 AOP
轻松应付。
◆声明式事务的支持
在 Spring 中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,
提高开发效率和质量。
◆方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在 Spring 里,测试不再是昂贵的操作,而是随手
可做的事情。
◆方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,相反,Spring 可以降低各种框架的使用难度,Spring 提供了对各种
优秀框架(如 Struts,Hibernate、Hession、Quartz)等的直接支持。
◆降低 Java EE API 的使用难度
Spring 对很多难用的 Java EE API(如 JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过 Spring
的简易封装,这些 Java EE API 的使用难度大为降低。
◆Java 源码是经典学习范例
Spring 的源码设计精妙、结构清晰、匠心独用,处处体现着大师对 Java 设计模式灵活运用以及对 Java 技
术的高深造诣。Spring 框架源码无疑是 Java 技术的最佳实践范例。如果想在短时间内迅速提高自己的 Java
技术水平和应用开发水平,学习和研究 Spring 源码将会使你收到意想不到的效果。
Spring 框架的好处
在我们进入细节以前,让我们看一下 Spring 可以给一个工程带来的一些好处:
◆Spring 能有效地组织你的中间层对象,无论你是否选择使用了 EJB。如果你仅仅使用了 Struts 或其他的
包含了 J2EE 特有 APIs 的 framework,你会发现 Spring 关注了遗留下的问题,。
◆Spring 能消除在许多工程上对 Singleton 的过多使用。根据我的经验,这是一个主要的问题,它减少了
系统的可测试性和面向对象特性。
◆Spring 能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法
来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读 Javadoc 乃
至源编码吗?有了 Spring,你可很简单地看到类的 JavaBean 属性。倒置控制的使用(在下面讨论)帮助完
成这种简化。
◆Spring 能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
◆Spring 被设计为让使用它创建的应用尽可能少的依赖于他的 APIs。在 Spring 应用中的大多数业务对象
没有依赖于 Spring。
◆使用 Spring 构建的应用程序易于单元测试。
◆Spring 能使 EJB 的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用 POJOs 或 local EJBs
来实现业务接口,却不会影响调用代码。
◆Spring 帮助你解决许多问题而无需使用 EJB。Spring 能提供一种 EJB 的替换物,它们适于许多 web 应用。
例如,Spring 能使用 AOP 提供声明性事务而不通过使用 EJB 容器,如果你仅仅需要与单个的数据库打交道,
甚至不需要 JTA 实现。
◆Spring 为数据存取提供了一致的框架,不论是使用 JDBC 或 O/R mapping 产品(如 Hibernate)。
Spring 确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring 有如下优点:
◆低侵入式设计,代码污染极低
◆独立于各种应用服务器,可以真正实现 Write Once,Run Anywhere 的承诺
◆Spring 的 DI 机制降低了业务对象替换的复杂性
◆Spring 并不完全依赖于 Spring,开发者可自由选用 Spring 框架的部分或全部
Spring 能做什么?
Spring 提供许多功能,在此我将快速地依次展示其各个主要方面。首先,让我们明确 Spring 范围。尽
管 Spring 覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。Spring 的主
要目的是使 J2EE 易用和促进好编程习惯。
Spring 不重新开发已有的东西。因此,在 Spring 中你将发现没有日志记录的包,没有连接池,没有分
布事务调度。这些均有开源项目提供 (例如 Commons Logging 用来做所有的日志输出,或 Commons DBCP
用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供 O/R mapping 层,
对此,已有有好的解决办法如 Hibernate 和 JDO。
Spring 的目标是使已存在的技术更加易用。例如,尽管我们没有底层事务协调处理,但我们提供了一
个抽象层覆盖了 JTA 或任何其他的事务策略。
Spring 没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,象许多开发
人员,我们从来没有为 Struts 高兴过,并且感到在 MVC web framework 中还有改进的余地。在某些领域,
例如轻量级的 IoC 容器和 AOP 框架,Spring 有直接的竞争,但是在这些领域还没有已经较为流行的解决方
案。(Spring 在这些区域是开路先锋。)
Spring 也得益于内在的一致性。所有的开发者都在唱同样的的赞歌,基础想法依然是 Expert
One-on-One J2EE 设计与开发的那些。并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个
领域。Spring 在应用服务器之间是可移植的。当然保证可移植性总是一次挑战,但是我们避免任何特定平
台或非标准化,并且支持在 WebLogic,Tomcat,Resin,JBoss,WebSphere 和其他的应用服务器上的用户。
Spring 作为现在最优秀的框架之一,已被广泛的使用,51CTO 也曾经针对 Spring 框架中的 JDBC 应用
做过报道。本文将从另外一个视角试图剖析出 Spring 框架的作者设计 Spring 框架的骨骼架构的设计理念,
有那几个核心组件?为什么需要这些组件?它们又是如何结合在一起构成 Spring 的骨骼架构?Spring 的
AOP 特性又是如何利用这些基础的骨骼架构来工作的?Spring 中又使用了那些设计模式来完成它的这种设
计的?它的这种 设计理念对对我们以后的软件设计有何启示?本文将详细解答这些问题。
Spring 的骨骼架构
Spring 总共有十几个组件,但是真正核心的组件只有几个,下面是 Spring 框架的总体架构图:
图 1.Spring 框架的总体架构图
从上图中可以看出 Spring 框架中的核心组件只有三个:Core、Context 和 Beans。它们构建起了整个
Spring 的骨骼架构。没有它们就不可能有 AOP、Web 等上层的特性功能。下面也将主要从这三个组件入手
分析 Spring。
Spring 的设计理念
前面介绍了 Spring 的三个核心组件,如果再在它们三个中选出核心的话,那就非 Beans 组件莫属了,
为何这样说,其实 Spring 就是面向 Bean 的编程(BOP,Bean Oriented Programming),Bean 在 Spring 中
才是真正的主角。
Bean 在 Spring 中作用就像 Object 对 OOP 的意义一样,没有对象的概念就像没有面向对象编程,Spring
中没有 Bean 也就没有 Spring 存在的意义。就像一次演出舞台都准备好了但是却没有演员一样。为什 么要
Bean 这种角色 Bean 或者为何在 Spring 如此重要,这由 Spring 框架的设计目标决定,Spring 为何如此流
行,我们用 Spring 的原因是什么,想想你会发现原来 Spring 解决了一个非常关键的问题他可以让 你把对
象之间的依赖关系转而用配置文件来管理,也就是他的依赖注入机制。而这个注入关系在一个叫 Ioc 容器
中管理,那 Ioc 容器中有又是什么就是被 Bean 包裹的对象。Spring 正是通过把对象包装在 Bean 中而达到
对这些对象管理以及一些列额外操作的目的。
它这种设计策略完全类似于 Java 实现 OOP 的设计理念,当然了 Java 本身的设计要比 Spring 复杂太多
太多,但是都是构建一个数据结构,然后根据这个数据结构设计他的生存环境,并让它在这个环境中 按照
一定的规律在不停的运动,在它们的不停运动中设计一系列与环境或者与其他个体完成信息交换。这样想
来回过头想想我们用到的其他框架都是大慨类似的设计理念。
核心组件如何协同工作
前面说 Bean 是 Spring 中关键因素,那 Context 和 Core 又有何作用呢?前面吧 Bean 比作一场演出中
的演员的话,那 Context 就是这场演出的舞台背景,而 Core 应该就是演出的道具了。只有他们在一起才能
具备能演出一场好戏的最基本的条件。当然有最基本的条件还不能使这场演出脱颖而出,还要他表演的节
目足够的精彩,这些节目就是 Spring 能提供的特色功能了。
我们知道 Bean 包装的是 Object,而 Object 必然有数据,如何给这些数据提供生存环境就是 Context
要解决的问题,对 Context 来说他就是要发现每个 Bean 之间的关系,为它们建立这种关系并且要维护好 这
种关系。所以 Context 就是一个 Bean 关系的集合,这个关系集合又叫 Ioc 容器,一旦建立起这个 Ioc 容器
后 Spring 就可以为你工作了。那 Core 组件又有什么用武之地呢?其实 Core 就是发现、建立和维护每 个
Bean 之间的关系所需要的一些列的工具,从这个角度看来,Core 这个组件叫 Util 更能让你理解。
它们之间可以用下图来表示:
图 2.三个组件关系
核心组件详解
这里将详细介绍每个组件内部类的层次关系,以及它们在运行时的时序顺序。我们在使用 Spring 是应
该注意的地方。
Bean 组件
前面已经说明了 Bean 组件对 Spring 的重要性,下面看看 Bean 这个组件式怎么设计的。Bean 组件在
Spring 的 org.springframework.beans 包下。这个包下的所有类主要解决了三件事:Bean 的定义、Bean 的
剩余33页未读,继续阅读
metarnetyflu
- 粉丝: 1
- 资源: 37
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0