




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、introducing to spring framework(中文修订版)作者: rod johnson 译者: yanger,taowen 校对: taowen 关于 spring framework,今年夏天你可能已经听见很多的议论。在本文中, 我将试图解释 spring 能完成什么,和我怎么会认为它能帮助你开发j2ee应用程序。又来一个 framework ?你可能正在想“不过是另外一个的framework”。当已经有许多开放源代码( 和专有) j2ee framework时,为什么你还要耐下心子读这篇文章或去下载spring framework?我相信 spring 是独特的,有几个
2、原因:list 它关注的领域是其他许多流行的framework未曾关注的。 spring 要提供的是一种管理你的业务对象的方法。spring 既是全面的又是模块化的。spring 有分层的体系结构,这意味着你能选择仅仅使用它任何一个独立的部分,而它的架构又是内部一致。 因此你能从你的学习中,得到最大的价值。例如,你可能选择仅仅使用spring 来简单化 jdbc的使用,或用来管理所有的业务对象。它的设计从一开始就是要帮助你编写易于测试的代码。spring 是使用测试驱动开发的工程的理想框架。/list:u spring 不会给你的工程添加对其他的框架依赖。spring 也许称得上是个一站式解决
3、方案,提供了一个典型应用所需要的大部分基础架构。它还涉及到了其他framework 没有考虑到的内容。尽管它仅仅是一个从2003 年 2 月才开始的开源项目, 但 spring 有深厚的历史根基。这个开源工程是起源自我在2002 年晚些时候出版的 expert one-on-one j2ee设计与开发书中的基础性代码。这本书展示了spring 背后的基础性架构思想。然而,对这个基础架构的概念可以追溯到2000年的早些时候 , 并且反映了我为一系列商业工程开发基础结构的成功经验。2003年 1 月,spring 已经落户于 sourceforge 上了。现在有 10 个开发人员, 其中 6 个是
4、高度投入的积极分子。spring 架构上的好处在我们进入细节之前,让我们来看看spring 能够给工程带来的种种好处:list spring 能有效地组织你的中间层对象,不管你是否选择使用了ejb 。如果你仅仅使用了 struts或其他为 j2ee的 api 特制的 framework,spring 致力于解决剩下的问题。spring 能消除在许多工程中常见的对singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。通过一种在不同应用程序和项目间一致的方法来处理配置文件,spring 能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的
5、是哪个魔法般的属性项或系统属性感到不解,为此不得不去读javadoc 甚至源编码?有了spring ,你仅仅需要看看类的javabean属性。inversion of control 的使用(在下面讨论)帮助完成了这种简化。通过把对接口编程而不是对类编程的代价几乎减少到没有,spring 能够促进养成好的编程习惯。spring 被设计为让使用它创建的应用尽可能少的依赖于他的apis。在 spring应用中的大多数业务对象没有依赖于spring 。使用 spring 构建的应用程序易于单元测试。spring 能使 ejb的使用成为一个实现选择, 而不是应用架构的必然选择。你能选择用 pojos
6、或 local ejbs来实现业务接口,却不会影响调用代码。spring 帮助你解决许多问题而无需使用ejb 。spring 能提供一种 ejb的替换物,它们适用于许多 web应用。例如, spring 能使用 aop 提供声明性事务管理而不通过 ejb容器, 如果你仅仅需要与单个数据库打交道, 甚至不需要一个 jta实现。spring 为数据存取提供了一个一致的框架, 不论是使用的是 jdbc还是 o/r mapping产品(如 hibernate )。/list:u spring 确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。spring 做了些什么?spring
7、 提供许多功能,在此我将依次快速地展示其各个主要方面。任务描述首先, 让我们明确 spring 范围。尽管 spring 覆盖了许多方面,但我们对它应该涉什么,什么不应该涉及有清楚的认识。spring 的主要目的是使 j2ee易用和促进好编程习惯。spring 不重新轮子。因此,你发现在spring 中没有 logging ,没有连接池,没有分布式事务调度。所有这些东西均有开源项目提供( 例如我们用于处理所有日志输出的 commons logging以及 commons dbcp),或由你的应用程序服务器提供了。出于同样的的原因,我们没有提供o/r mapping层。对于这个问题已经有了像 h
8、ibernate 和 jdo这样的优秀解决方案。spring 的目标就是让已有的技术更加易用。例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了jta或任何其他的事务策略。spring 没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,象许多开发人员一样,我们从来没有对struts感到高兴过,并且觉得到在 mvc web framework中还有改进的余地。在某些领域,例如轻量级的ioc容器和 aop 框架, spring 确实有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。 (spring 在这些领域是开路先锋。) spring 也得益于内在的一
9、致性。所有的开发者都在唱同样的的赞歌,基础想法依然与 expert one-on-one j2ee设计与开发中提出的差不多。并且我们已经能够在多个领域中使用一些中心的概念,例如inversion of control。spring 在应用服务器之间是可移植的。当然保证可移植性总是一种挑战,但是我们避免使用任何平台特有或非标准的东西,并且支持在weblogic,tomcat,resin,jboss,websphere 和其他的应用服务器上的用户。inversion of control 容器spring 设计的核心是 org.springframework.beans 包, 它是为与 javab
10、eans一起工作而设计的。这个包一般不直接被用户使用,而是作为许多其他功能的基础。下一个层面高一些的抽象是bean factory。一个 spring bean factory 是一个通用的 factory ,它使对象能够按名称获取,并且能管理对象之间的关系。bean factories 支持两种模式的对象:list singleton :在此模式中,有一个具有特定名称的共享对象实例,它在查找时被获取。这是默认的, 而且是最为经常使用的。 它对于无状态对象是一种理想的模式。prototype :在此模式中,每次获取将创建一个独立的对象。例如,这可以被用于让用户拥有他们自己的对象。/list:u
11、 由于 org.springframwork.beans.factory.beanfactory是一个简单的接口, 它能被大量底层存储方法实现。你能够方便地实现你自己的beanfactory ,尽管很少用户需要这么做。最为常用的beanfactory 定义是:list xmlbeanfactory: 可解析简单直观的定义类和命名对象属性的xml结构。 我们提供了一个 dtd来使编写更容易。listablebeanfactoryimpl:提供了解析存放在属性文件中的bean定义的能力,并且可通过编程创建beanfactories 。/list:u 每个 bean 定义可能是一个 pojo (通过
12、类名和 javabean初始属性定义),或是一个 factorybean 。factorybean 接口添加了一个间接层。通常,这用于创建使用 aop 或其他方法的代理对象: 例如,添加声明性事务管理的代理。 (这在概念上和 ejb的 interception相似,但实现得更简单。)beanfactories 能在一个层次结构中选择性地参与,继承 ancestor (祖先)的定义。这使得在整个应用中公共配置的共享成为可能,虽然个别资源,如controller servlets,还拥有他们自己的独立的对象集合。这种使用 javabeans的动机在 expert one-on-one j2ee d
13、esign and development的第四章中有描述,在theserverside 网站上的有免费的pdf版本(http:/ 。通过 beanfactory 概念, spring 成为一个 inversion of control的容器。 ( 我不怎么喜欢 container这个词,因为它使人联想到重量级容器,如ejb容器。spring 的 beanfactory 是一个可通过一行代码创建的容器,并且不需要特殊的部署步骤。 ) inversion of control 背后的概念经常表述为hollywood 原则的:“don t call me , i ll call you。” ioc
14、 将控制创建的职责搬进了框架中,并把它从应用代码脱离开来。 涉及到配置的地方, 意思是说在传统的容器体系结构中,如 ejb ,一个组件可以调用容器并问“我需要它给我做工作的对象x在哪里?”; 使用 ioc容器则只需指出组件需要x对象,在运行时容器会提供给它。 容器是通过查看方法的参数表(例如javabean的属性)做到的,也可能根据配置数据如xml 。ioc 有几个重要的好处,例如:list 因为组件不需要在运行时间寻找合作者,所以他们可以更简单的编写和维护。在spring 版的 ioc 里,组件通过暴露javabean的 setter方法表达他们依赖的其他组件。这相当于ejb通过 jndi
15、来查找, ejb查找需要开发人员编写代码。同样原因,应用代码更容易测试。javabean属性是简单的,属于java 核心的,并且是容易测试的: 仅编写一个自包含的junit 测试方法用来创建对象和设置相关属性即可。一个好的 ioc 实现保留了强类型。 如果你需要使用一个通用的factory来寻找合作者,你必须通过类型转换将返回结果转变为想要的类型。这不是一个大不了的问题,但是不雅观。使用ioc,你在你的代码中表达了强类型依赖,框架将负责类型转换。这意味着在框架配置应用时, 类型不匹配将导致错误; 在你的代码中,你无需担心类型转换异常。大部分业务对象不依赖于ioc 容器的 apis。这使得很容易
16、使用遗留下来的代码,且很容易的使用对象无论在容器内或不在容器内。例如,spring 用户经常配置jakarta commons dbcp 数据源为一个 spring bean:不需要些任何定制代码去做这件事。我们说一个 ioc 容器不是侵入性的: 使用它并不会使你的代码依赖于它的 apis。任何 javabean在 spring bean factory中都能成为一个组件。/list:u 最后应该强调的是, ioc 不同于传统的容器的体系结构,如ejb ,应用代码最小程度地依靠于容器。这意味着你的业务对象可以潜在的被运行在不同的ioc 框架上或者在任何框架之外不需要任何代码的改动。以我和其他
17、spring 用户的经验来说,再怎么强调ioc 给应用程序代码带来的好处也不为过。ioc 不是一个新概念,但是它在j2ee团体里面刚刚到达黄金时间。有一些可供选择的 ioc 容器: 例如 apache avalon, picocontainer 和 hivemind 。avalon 从没怎么流行,尽管它很强大而且有很长的历史。avalon 相当的重和复杂,并且看起来比新的 ioc 解决方案更具侵入性。 picocontainer是一个轻量级而且更强调通过构造函数表达依赖性而不是javabean 属性。 与 spring 不同,它的设计允许每个类型一个对象的定义( 可能是因为它拒绝任何java
18、代码外的元数据导致的局限性 )。在 spring , picocontainer 和其他 ioc frameworks 之间做比较,可参看文章spring 网站上的 the spring framework - a lightweight container 位于/docs/lightweight_container.html。 这个页面里面包含了 picocontainer站点的链接。spring beanfactories 是非常轻量级的。 用户已经成功地将他们应用在applets和单独的 swing 应用中。 (它们也很好地工作在
19、ejb容器中。 ) 没有特殊的部署步骤和察觉得到的启动时间。 这个能力表明一个容器在应用的任何层面几乎立即可以发挥非常大的价值。spring beanfactory 概念贯穿于 spring 始终, 而且是 spring 如此内在一致的关键原因。在 ioc 容器中, spring 也是唯一的,它使用ioc 作为基础概念贯穿于整个功能丰富的框架。对应用开发人员, 最重要的是,一个或多个 beanfactory 提供了一个定义明确的业务对象层。这类似于local session bean层,但比它更简单。与ejbs不同,在这个层中的对象可能是相关的,并且他们的关系被拥有它们的factory管理。有
20、一个定义明确的业务对象层对于成功的体系结构是非常重要的。spring applicationcontext 是 beanfactory 的子接口,为下列东西提供支持:list 信息查找,支持着国际化事件机制,允许发布应用对象以及可选的注册以接收到事件可移植的文件和资源访问/list:u xmlbeanfactory 例子spring 用户通常在 xml的“bean 定义”文件中配置他们的应用。spring 的 xml bean定义文档的根是 元素。该元素包含一个或多个 定义。我们一般给每个 bean 定义的指定类和属性。 我们还必须指定 id 作为标识, 这将成为在代码中使用该 bean 的名
21、字。让我们来看一个简单的例子,它配置了三个应用程序对象,之间的关系在j2ee应用中常常能够看到:list j2ee datasource 使用 datasource 的 dao 在处理过程中使用dao 的业务对象/list:u 在下面的例子中,我们使用一个来自jakarta commons dbcp 项目的basicdatasource 。这个 class (和其他许多已有的class 一样)可以简单地被应用在 spring bean factory中,只要它提供了javabean格式的配置。需要在shutdown 时被调用的 close 方法可通过 spring 的destroy-metho
22、d属性被注册,以避免 basicdatasource 需要实现任何 spring 的接口。java 代码1. 2.3. 6. com.mysql.jdbc.driver 7. jdbc:mysql:/localhost:3306/mydb 8. root 9. basicdatasource 中我们感兴趣的所有属性都是string类型的,因此我们用 元素来指定他们的值。如果必要的话,spring 使用标准的 javabean 属性编辑器机制来把string转换为其他的类型。现在, 我们定义 dao , 它有一个对 datasource 的 bean引用。 bean间关系通过 元素来指定:jav
23、a 代码1. 3. 4. 5.6. the business object has a reference to the dao, and an int property (exampleparam);: 7. 9. 10. 10 11. 12. 13. 对象间的关系一般在配置中明确地设置,象这个例子一样。 我们认为这样做是件好事情。然而 spring 还提供了我们称做 autowire的支持,一个 la picocontainer ,其中它指出了 bean 间的依赖关系。这样做的局限性picocontainer也是如此是如果有一个特殊类型的多个bean, 要确定那个类型所依赖的是哪个实例是不
24、可能。好的方面是,不满足的依赖可以在factory初始化后被捕获到。( spring 也为显式的配置提供了一种可选的依赖检查,它可以完成这个目的)在上面的例子中, 如果我们不想显式的编写他们的关系,可使用如下的 autowire特性:java 代码1. 4.5. 10 6. 使用这个特性, spring 会找出 examplebusinessobject 的 datasource 属性应该被设置为在当前 beanfactory 中找到的 datasource 实现。 在当前的 beanfactory中,如果所需要类型的bean 不存在或多于一个,将产生一个错误。我们依然要设置 examplep
25、aram属性,因为它不是一个引用。autowire 支持和依赖检查刚刚加入cvs并将在 spring 1.0 m2(到 10/20,2003)中提供。本文中所讨论的所有其他特性都包含在当前1.0 m1 版本中。把管理从 java 代码中移出来比硬编码有很大的好处,因为这样可以只改变xml文件而无需改变一行java 代码。例如,我们可以简单地改变mydatasource的bean定义引用不同的bean class 以使用别的连接池,或者一个用于测试的数据源。 xml节变成另一种,我们可以用spring 的 jndi location factorybean从应用服务器获取一个数据源。现在让我们来
26、看看例子中业务对象的java 代码。注意下面列出的代码中没有对spring 的依赖。不像 ejb容器, spring beanfactory不具有侵入性:在应用对象里面你通常不需要对spring 的存在硬编码。java 代码1. public class examplebusinessobject implements mybusinessobject 2.3. private exampledataaccessobject dao; 4. private int exampleparam; 5.6. public void setdataaccessobject(exampledataacc
27、essobject dao); 7. this.dao = dao; 8. 9.10. public void setexampleparam(int exampleparam); 11. this.exampleparam = exampleparam; 12. 13. 14. public void mybusinessmethod(); 15. / do stuff using dao 16. 17. 注意那些 property setter,它们对应于 bean 定义文档中的 xml引用。这些将在对象被使用之前由spring 调用。这些应用程序的 bean 不需要依赖于 spring
28、:他们不需要实现任何spring 的接口或者继承 spring 的类。他们只需要遵守 javabeans 的命名习惯。在 spring 应用环境之外重用它们是非常简单的,例如,在一个测试环境中。 只需要用它们的缺省构造函数实例化它们, 并且通过调用 setdatasource() 和 setexampleparam()手工设置它的属性。 如果你想以一行代码支持程序化的创建,只要你有一个无参数的构造器,你就可以自由定义其他需要多个属性的构造函数。注意在业务接口中没有声明将会一起使用的javabean属性。 他们是一个实现细节。我们可以“插入”带有不同bean 属性的不同的实现类而不影响连接着的对象或者调用的代码。当然, spring xml bean factories 有更多的功能没有在这里描述,但是,应当让你对基本使用有了一些感觉。以及,简单的属性
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨界合作在科技金融服务体系中的实践与启示
- 网络安全技术更新日志表
- 文化娱乐产业资源整合合同
- 【数学】现实中的变量课件 2024-2025学年北师大版数学七年级下册
- 音乐与戏剧与经典文学历久弥新
- 风能、太阳能-未来能源产业的新方向
- 顾客为中心的线上线下融合营销实践
- 非物质文化遗产在办公空间设计中的重要性
- 项目管理中的数据分析决策支持
- 防灾减灾从我做起学生自我保护能力的提升
- 2025年新高考1卷(新课标Ⅰ卷)语文试卷(含答案)
- 2025年小学一年级数学下册奥数竞赛测试考试卷(含答案解析)
- 2023-2024年福建高中物理会考试卷(福建会考卷)
- 人体发育学智慧树知到期末考试答案章节答案2024年温州医科大学
- JT-T 1495-2024 公路水运危险性较大工程专项施工方案编制审查规程
- 企业项目计划书和研究开发项目目立项决议文件参考格式.docx
- 《民族传统体育项目》教学大纲
- 供应商质量处罚单
- 东北大学编译原理课程设计报告
- 《谷氨酸的生产工艺》PPT课件.ppt
- 电压测量装置课程设计
评论
0/150
提交评论