J2EE和Spring实用编程13956.pdf
《J2EE和Spring实用编程13956.pdf》由会员分享,可在线阅读,更多相关《J2EE和Spring实用编程13956.pdf(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 Spring Web Framework J2EE 和 Spring 实用编程 Revision History Date 03/09/2005 04/01/2005 04/20/2005 By Version 0.1 0.2 0.3 Description Initial draft.Settle the content release Revised 4/20/2005 Page 1 of 38 Spring Web Framework Table of Contents 1 SPRING 简介.4 1.1 J2EE 应用软件.4 1.2 SPRING 框架.5 1.3 面向对象的准则.
2、5 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 开闭原则(OCP,THE OPEN-CLOSED PRINCIPLE).6 依赖反向原则(DIP,DEPENDENCY INVERSION PRINCIP LE).6 接口分离原则(ISP,INTERFACE SEGREGATION PRINCIPLE).6 迪米特法则(LAW OF DEMETER).6 组合/继承原则(CRP,COMPOSITE REUSE PRINCIP LE).6 李斯可夫代换原则(LISKOV SUBSTITUTION PRINCIP LE).6 参考资料.6 2 SPRING 核
3、心包(CORE)和 CONTEXT 包.7 2.1 BEANWRAPPER 类及其应用.7 2.1.1 2.1.2 简单例子.8 新的类型转换.9 2.2 BEANFACTORY 接口和它的实现类.10 2.2.1 BEANFACTORY 的实现类.11 2.2.1.1 由 Properties 定义的 BeanFactory.11 2.2.1.2 在 BeanFactory 中对象间的引用.11 2.2.1.3 新的类型转换.12 2.2.1.4 用 XML 来定义对象.13 2.2.1.5 用 CustomEditorConfigurer 来定义数据类型转换.14 2.2.1.6 外部配置
4、文件.16 2.2.1.7 JVM 系统参数.17 2.2.1.8 两个外部配置文件.18 2.2.1.9 其它的配置方式.19 2.2.2 BEANFACTORY 是一个对象容器.20 2.2.2.1 单例和多例.20 2.2.2.2 父 Bean 和抽象 Bean.20 2.2.2.3 内部 Bean.20 2.2.2.4 别名(alias).20 2.2.2.5 输入其它 XML 配置(Import).21 2.2.2.6 Spring 自带的一些工厂方法.21 2.2.2.7 BeanFactoryWare 接口和 Spring 扩展.21 2.3 APPLICATIONCONTEXT
5、 接口和它的实现类.29 2.3.1 2.3.2 2.3.3 同时载入几个配置文件.30 资源载入.31 国际化支持.34 Revised 4/20/2005 Page 2 of 38 Spring Web Framework 2.4 启动 APPLICATIONCONTEXT 的几种方式.34 2.5 控制倒置(IOC),依赖注入(DEPENDENCY INJECTION)和轻型容器.35 3 SPRING 面向方面包(AOP PACKAGE).37 4 SPRING 网页包(WEB PACKAGES).38 5 用 JAVA 制做网页的几种技术选择.38 6 SPRING 持久性存贮包(P
6、ERSISTENCE PACKAGES)和事务处理.38 7 用 JAVA 做持久性存贮的几种技术选择.38 8 SPRING 网络包.38 9 SPRING 其他的 J2EE 包.38 10 J2EE 编程的几点考虑.38 Revised 4/20/2005 Page 3 of 38 Spring Web Framework 1 Spring 简介 自从 J2EE 诞生以来,它已经成为大型企业应用软件的最佳平台。在 2002 年,Rod Johnson 的书 Expert One-on-One J2EE Design and Development 更进一步地改变我们的 J2EE 编程。很多
7、 JAVA 书是后学院式的讲解,但是这本书却是经验和实践的结晶,从而成为一本经典著作。Spring 框架是在这本书中范例的基础上拓展出 来的。自从 Spring 框架 1.0 发布以来,它很快地被 J2EE 社区所接受。有人评论说,Spring 框架又把 OO 编程 带回到 J2EE 中来了。今天,Spring 框架已经相当成熟,远远超出了 Rod 在他书中所陈述的,而且它还在不断 地完善和拓展。我们将首先陈述大型企业应用编程中的一些常见问题和需求,然后解释 Spring 是如何解决这些问题和满足这 些需求的。这样做会比近乎宗教式的说教更具有针对性和实用性。Spring 框架是实践和经验的积累
8、,不是某 个天才坐在办公室凭空想象出来的(当然,我们不排除这种可能性,某一天被苹果砸一下后会有超出寻常的想 法)。但是我们所见到的 Spring 框架已经是这些积累的抽象了,所以,了结它所解决的问题及上下文会有助 于理解和使用 Spring 框架。我们因为经验有限,不可能概括所有的方方面面,所以只讨论我们认为最常见的 和最重要的案例。如果读者想进一步探讨,请参阅其它资料或 google,以下资料应该是一个良好的开端:z Spring 网站:http:/www.springframework.org/,这里有 Spring 框架的下载,官方文件,讨论社区等。z Expert One-on-One
9、 J2EE Design and Development,这是 Rod Johnson 在 2002 年下半年出版的书。这本 书所讨论的实践经验是非常具有实用价值的。z Expert One-on-One J2EE Development Without EJB,这是 Rod Johnson 继上一本书的更新。但不是上一 本书的的替代。z Spring in Action,作者是 Craig Walls 和 Ryan Breidenbach z Spring Live,作者是 Matt Raible,他的 Blog 有很多有用的技巧。z Pro Spring 另外,Spring 的官方文件已经
10、有中文版了,读者可以参阅。我们假定读者具有 JDK 和 J2EE 的一般知识。为了让读者可以运行例子中的程序,我们列出了完整的程序并且 尽量使它们短小和独立,希望读者动手尝试。1.1 J2EE 应用软件 企业应用软件不同于桌面上的应用程序,它们的要求差别很大。企业应用软件通常考虑如下的重要方面:z 应用程序的安全性(security)z 应用操作的事务(transaction)和记录(audit)z 服务的不间断性(service continuity)z 软件的运行环境(runtime environment)和发布过程(deployment)z 软件的开发成本(development co
11、st)及开发周期(development cycle)z 软件的维护成本(maintenance)和维修速度(response time)z 软件的伸缩性(scalability)J2EE 在很大程度上提供了一个良好的基础设施来可以满足这些需求。例如 JDBC,它很好的概括了数据库的操 作,使得在很大程度上简化了数据库操作的编程。在 B2C 的 Web 应用中,因为客户端用 Web 浏览器,所以几 乎不需要安装客户程序,也就没有客户程序的更新和维护了。这使得软件更新和维护得到很大的简化。而且,Web 浏览器也差不多形成不是标准的标准了,能出现很大变化的余地也很小了。在 B2B 的应用中,Jav
12、a 内在的 网络功能已经使它很方便,JMS 和 WebServices 更是锦上添花。Revised 4/20/2005 Page 4 of 38 Spring Web Framework 1.2 Spring 框架 J2EE 尽管在企业应用中取得了很大成功,但是在许多情况下还是不尽人意,例如它只是提供了最基本的服 务,而没有更高级的功能;它的 EJB 容器经常被误用。Spring 框架正是在这种需求中开发出来的,它填补了 很多介于 J2EE 的基本功能和企业应用软件的需求之间的空缺,从而使得 J2EE 编程非常简便。Spring 框架的 几个重要特点是:z Spring 框架的核心是一个具有
13、赖注入(Dependency Injection)功能的轻型对象容器。它通过依赖注入 (Dependency Injection)来设定对象之间的依赖关系。它是无侵入性的,即不需要我们的类实现任何接 口,只需我们遵循 JavaBean 的一些规范而已。因为依赖关系的设定是由 Spring 容器来完成的,所以编程 得到大量的简化,同时耦合性也大大地降低了。从而也使得测试得到简化,因为在测试中我们可以注入 mock 对象。它也支持 AOP,使得我们可以面向切面编程。z Spring 框架集成了很多 J2EE 组件,它利用它的轻容器扩展了这些组件,提供了更高级的功能。它不仅集 成了很多 J2EE 的
14、最佳实践,而且有的功能更是先驱性的实践,例如,无侵入性的事务,WEB 中的 Action 和 View 的抽象和分离(这使得我们可以在不更改 Action 的情况下替换 View)。它更进一步地集成了很 多成熟的工具,例如 Hibernate,iBATIS,JDO 等数据库编程工具,JSP/JSTL,Struts,Velocity,WebWork,Tapestry,Portal,Tiles 等表示层工具。z 使得我们更便捷地遵循 OOP,面向对象的原则(Object-oriented principles)。相比之下,如果我们的 编程环境和实践使得遵循 OOP 很困难或很麻烦,例如 J2EE
15、核心模式中的一些例子,那么人们很可能就会 在实践中放弃 OOP。所以,Spring(还有其他一些类似的工具)不仅仅是一个工具的改进,同时也是对 OOP 的编程环境和实践的极大改进和更新。它更掀起一股轻容器(Lightweight container)的热潮(轻容 器是相对于 EJB 等重容器而言的,轻重实际上是指是否易用,是否容易部署,可以快速启动)。z 同时,Spring 框架本身很好地遵循了 OOP 原则,所以它具有很好的扩展性。当然,没有什么东西是尽善尽美的,万能的银弹(silver bullet)和圣杯(Holy Grail)是不存在的。在实际应用 中,Spring 也存在着一些问题:
16、z 因为对象之间的依赖是在容器中设定的,当对象较多时,依赖关系不是像写在 Java 程序里那样显而易见 和易于跟踪。这多多少少只是一个习惯而已。z 因为对象之间的依赖关系是用 XML 来描述的,所以设置的正确与否只能用运行来检验,而不能用编译来 检验。z 当我们用 setter()来设置依赖关系时,可能会破坏数据的封装,可能会用错误的对象属性的组合或顺序,可 能会使公共界面更复杂。这一点可以通过接口来克服。z 它的 XML 配置有些烦亢,不过我们可以分成数个文件来进行分类。但是,这些很少会构成很大的问题。事实上,Spring 框架是在我们用过的所有框架中问题最少的。Spring 框架的学习难度
17、是和编程经验,以及对 OOP 的认识和理解成反比。所以下面我们简单地介绍一下 OOP,有兴趣的读者请参阅其他书籍和资料,OOP 这 20 年的积累是非常丰富的。我们仅从实用出发,讲解一些要 点,为以后的讨论做些准备。1.3 面向对象的准则 人们编写软件的目的除了使用外,另一个目的是容易修改,否则我们就改制硬件了。所以说,变更是软件的天 性。我们不应该限制软件的更新,而应该适应更新,创造环境使得容易更新,甚至预计可能的变化(所以我们 才有更多的工作机会)。人们经过长期的经验积累和研究认识到,具有可重用性和可维护性的软件能够很好地 适应变化。这里,可重用性是指一个软件模块能否被用在很多不同场合;可
18、维护性是指一个软件模块是否容易 修改,更新和扩展。在面向对象的实践中,人们为了写出具有这两个性质的模块,总结了一些原则。下面,我 们简略地介绍一下这些原则。值得指出的是,除了第一个开闭原则外,其它原则主要是针对类而言的。现在,人们又总结了一些针对包的原则,但是因为它和我们的内容没有太多的直接关系,所以我们略去不谈。有兴趣 的读者可以参阅一下相关的资料。Revised 4/20/2005 Page 5 of 38 Spring Web Framework 1.3.1 开闭原则(OCP,The Open-Closed Principle)开闭原则是说,所有软件模块都应该可以扩展,但不可以修改。遵循
19、这个原则的关键在于抽象化。我们在写一 个模块时,不论是一个类,还是一个构件,都应该认真思考它的真正功能,它对其它模块的依赖性,输入和输 出,等等。分离出它的可变部分(例如,用接口或外部配置等),对不变部分进行封装。这些不变部分就是这 个模块的本质。这里需要说明的是,在对不变部分进行封装时,我们如何定义不变的部分。在数学中,当我们 谈到不变量时,总是要指明它是在什么变化下的不变量。否则是没有意义的,因为在一种变化下的不变量很有 可能在另一种变化下就不是不变量了。所以,当我们定义不变的部分时,首先要明确它的变化范围。但是,在 软件开发中,很难事先准确的知道这些变化,很多时候是凭经验或行业知识来判断
20、的。所以,这个原则多多少 少带有主观性,更像一个总纲而不像一个硬性的法律条文。Martin Fowler 的书 Analysis Patterns 讲解了一些实 际经验,有兴趣的读者可以参考。下面这些原则是讲如何安排依赖性使得模块具有良好的封闭性,可重用性和 可维护性。1.3.2 依赖反向原则(DIP,Dependency Inversion Principle)依赖反向原则是说,要依赖于抽象,而不要依赖于具体。这也就是我们所说的:要针对接口编程,而不要针对 实现编程。之所以是倒置,是因为通常在开始依照需求编程时,我们几乎总是依赖于具体的实现。但是,这些 具体的实现都不易适应变化,所以要抽象出
21、一些不变的,本质的功能,把可变的留到具体的实现中去。这种抽 象的过程是前面过程的反向,例如,当我们需要写出结果时,开始时可能会写到文件里,后来可能会写到网络 流里,等等。抽象的结果是写这个功能。针对接口编程是一个不可能过分强调的原则。接口就像高楼大厦中层 与层之间,户与户之间的防火墙;大船巨舰中的隔离舱。软件的更新有时就像水火一样难以预料和不可避免 (所以我们叫它软件而不是硬件),而接口会适当地屏蔽软件更新所带来的改动扩散(连锁传播)。通常,类 的依赖性由这个原则和组合/继承原则主导,而不是由继承主导。1.3.3 接口分离原则(ISP,Interface Segregation Princip
22、le)接口分离原则是说,不相关的功能应在不同的接口里。不然,在需要一个功能时也不得不同时也依赖于另一个 没必要的功能。例如,在早期的 EJB 中,数据库调用和远程调用混在一起,在不需要远程调用时恰好是最糟糕 的组合。这个原则说的是,接口的依赖性宽度越窄越好。下面的原则说的是接口的依赖性深度越浅越好。1.3.4 迪米特法则(Law of Demeter)Demeter 法则是说尽量不要有传递性,链型的依赖关系。不要和陌生人交谈,只和亲属和朋友交谈。在一个类 中,可以调用类里的其它方法,可以调用类属性的方法,可以调用方法中传递变量的方法,可以调用在方法中 声明的变量的方法。但不应该调用属性的属性的
23、方法。1.3.5 组合/继承原则(CRP,Composite Reuse Principle)组合/继承原则是说,优先使用组合而不是继承。当我们用低级对象来构造高级对象时,应该用组合。一个系 统的框架也应该是由组合和接口构成的。下面的原则说明,继承仅仅是帮助实现,而不是帮助构造新的对象 的。1.3.6 李斯可夫代换原则(Liskov Substitution Principle)Liskov 代换原则是说,任何父类可以出现的地方,子类也可以出现。子类在改变父类属性状态时要遵守父类的 行为(即不能有更强的先决条件,只能有更弱的先决条件)。这就意味着无法用继承来构造行为差异很大的对 象。1.3.7
24、 参考资料 读者可以参考以下资料:http:/ http:/ Revised 4/20/2005 Page 6 of 38 Spring Web Framework 2 Spring 核心包(Core)和 Context 包 在这一章里,我们将讨论 Spring 框架中的轻型容器。它由两个最基础的包组成,Spring 核心包和 Context 包。在这两个包里有三个最重要的接口,BeanWrapper,BeanFactory,和 ApplicationContext。我们将通过 探讨这三个接口来讲解这两个包的目的,用法,功能以及它们是如何实现这些功能的。只有明白了它们所解决 的问题和它们所用的
25、方法,才能有效地使用它们。实际上,这三个接口和它们的实现及附属类构成了三个层 次,它们各自解决不同而相关的问题。核心包是整个 Spring 框架的基础,它同时又是一个独立的组件,可以单独地使用。Spring 的发布包里的 dist (是英文 distribution,发布的缩写)目录下有一个文件 spring-core.jar,它大约有 240K。这个 jar 文件 可以单独使用,它不依赖其它的 Spring 包。Apache commons-logging.jar 是它唯一依赖的第三方的包。核心包最早是用来解决程序配置中的一些问题的,例如,程序配置方式的不统一,配置中单例模式的无限制的 调用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- J2EE Spring 实用 编程 13956
限制150内