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