Spring 3.x企业应用开发实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-19 01:30:38

点击下载

作者:陈雄华

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Spring 3.x企业应用开发实战

Spring 3.x企业应用开发实战试读:

版权信息书名:Spring 3.x企业应用开发实战作者:陈雄华排版:辛萌哒出版社:电子工业出版社出版时间:2012-02-01ISBN:9787121152139本书由电子工业出版社授权北京当当科文电子商务有限公司制作与发行。— · 版权所有 侵权必究 · —内容简介

Spring 3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。

Spring 3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java Web应用开发的难度,同时有效提升应用开发的优雅性。

本书是在《精通Spring 2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用Spring的各项功能的同时,还能透彻理解Spring的内部实现,真正做到知其然知其所以然。此外,本书重点突出了“实战性”的主题,力求使全书“从实际项目中来,到实际项目中去”。前 言本书小述

Spring为Java世界带来了一场震撼性的技术革新,它颠覆了传统Java应用开发笨重的方式,影响和正在影响着Java开发者思考问题的方法。从2004年发布第一个版本以来,Spring逐渐占据了Java开发人员的视线,博得了开源社区一片赞誉之声,开源社区里“春”城无处不飞花。

在2006年发布Spring 2.0版本后,Spring的易用性,扩展性和整合性得到了充分的展示,越来越多Java开发者争先恐后地投奔到Spring平台中来,Spring已成为事实上的Java应用开发平台,成为Java一站式轻量级平台的无冕之王。

在历经长达3年的磨砺之后,2009年Spring 3.0横空出世,挟带着SpEL、OXM、REST、验证/格式化等众多令人惊艳的新功能再次掀起一场Spring的热潮。笔者在2007年曾撰写的拙作《精通Spring 2.x》已经显得昨日黄花,有感于读者朋友的青睐和出版社朋友的力促,一直希望能与时俱进将本书翻版更新,但囿于这两年工作繁忙且笔者又不希望草率应付,遂使心中夙愿沉积日久渐成心病。由于在可预知的未来皆难有大段空暇的时间,想起刘墉之创作《萤窗小语》都是掇拾繁忙之空隙集腋成裘,因此,笔者亦学习效仿之,利用节假日,周末等时间完成原版的改造,从2010年国庆开始到2011年国庆结束,历时已一年矣。

本次改版,不但将全书内容更新同步到Spring 3.0,还对原版内容进行了大面积的优化和调整。例如,对单元测试、WebService等内容进行了全新重写,对Spring事务管理各种疑难困惑详细剖析,此外还引入一章逼真再现一个实战性Web项目的开发全过程等。所有这些调整的目的都是希望在延续前版的“深入”的同时,能让本书更贴近于“实战”。本书的特点

●揭示内幕、深入浅出:笔者对Spring的源码进行了彻底的分析,深刻揭示了Spring框架的技术内幕,让读者知其然,更知其所以然。Spring中许多设计经验、技巧、模式具有很高的借鉴性,在透彻学习Spring体系结构的同时,读者可以直接将这些方法引借到具体的应用开发中。

●同步更新、与时俱进:虽然在2009年9月就发布Spring 3.0第一个候选版本,后来又发布了多个RC版本,并最终于2011年10月发布了Spring 3.1的正式版本。新功能的添加以及旧功能的调整从来就没有停止过。笔者在本书写作过程中时刻关注Spring新版本功能的变化,并及时调整全书内容与其同步,保证全书内容与时俱进。

●突出重点,淡化边缘:虽然全书洋洋洒洒近800页,便本书没有片面追求内容的面面俱到,相反,我们特别注意内容的剪裁和取舍。对于实用性强的知识点深入分析、深度挖掘,而对于不常使用的知识点到为止,甚至不纳入本书的范围。举例来说,我们对使用Spring-WS开发基于Spring的Web Service应用、OXM、Spring MVC等这些实用性强的技术都进行了深入的分析,而对如何集成EJB、JMX、JCA等这些不常使用的功能完全不涉及。很好地做到了实用性和深入性二者的统一。

●理论透彻、面向实践:本书在透彻分析原理、讲解技术知识点的同时,特别注意与实际应用的结合,笔者将自身丰富的实战经验糅合到全书的相关知识点上,很好地做到了知识讲解和实践经验的结合。让读者在掌握纯技术知识的同时,能够对如何活用技术做到胸有成竹。如笔者在第13章讲解任务调度的内容时,专门辟出13.6小节讲解实际应用中任务调度的使用经验;在第18章中讲述使用JavaMail发送电子邮件时,专门通过18.4小节讲述了在实际应用中发送邮件的各种注意事项。此外,我们还适时提供了“实战经验”的插文,它们在不影响上下文连贯性的同时让读者学习到了相关技术的实战经验。诸如此类以实际应用为导向的内容贯穿全书,这是本书区别于其他书籍特色之一。

●代码简洁、图例丰富:全书的代码在排版布局以及内容的剪裁上颇费心思,实例代码重点关注当前知识点涉及的内容,弱化边缘代码,并采用特殊的排版方式适时添加简明扼要的注释,方便程序代码的阅读和重点内容的把握。全书拥有大量精美的图表,这些图表很好地解构了上下文中一些难点的知识,大大提高了阅读性,降低了理解的难度。

●注重趣味、轻松阅读:由于技术书籍的严谨性、知识性的特点,阅读技术书籍往往是枯燥乏味的,更遑论趣味性。笔者对此深有感触,为寻求一些突破,我们在全书大部分章节都精心设计一个“轻松一刻”,它们和上下文内容存在某种程度的关联性,但其本身是一段趣味性的短文,它们在增强全书趣味性的同时,还为读者提供另外一个思考问题的角度。

●相关知识、一网打尽:Spring不但本身涉及众多Java技术,其集成的第三方技术本身也涵盖了丰富的知识。我们在介绍Spring相关技术时,都会简明扼要地讲解相关联的基础知识,这包括JDK 5.0的新知识和被集成技术的知识,准备好知识背景,而不是完全脱离背景知识的情况下孤立讲解Spring的知识。

●历时一载、倾力打造:本书从筹划到全书改版完成,历经近一年的时间,笔者充分利用所有可用的空闲时间,多次拖延完稿的计划,终于于2011年国庆才完成本书的所有稿件。本书的结构

本书分为5大篇,其中第1篇为Spring概述性知识;第2篇讲解了Spring的IoC和AOP的知识;第3篇讲解Spring的各种数据访问技术的内容;第4篇讲解业务层和Web层的技术;第5篇讲解面向实践的单元测试及实战项目。由于篇幅所限,笔者将邮件发送及WebService的章节以电子文档的形式作为附件放到光盘中,请读者通过光盘进行阅读。

下面简要介绍一下每章的内容。

第1章:对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识。

第2章:通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。

第3章:讲解Spring IoC容器的知识,通过具体的实例详细地讲解IoC概念。同时,对Spring框架的三个最重要的框架级接口进行了剖析,并对Bean的生命周期进行讲解。

第4章:讲解如何在Spring配置文件中使用Spring 3.0的Schema格式配置Bean的内容,并对各个配置项的意义进行了深入的说明。

第5章:对Spring容器进行解构,从内部探究Spring容器的体系结构和运行流程。此外,我们还将对Spring容器一些高级主题进行深入的阐述。

第6章:我们从Spring AOP的底层实现技术入手,一步步深入到Spring AOP的内核中,分析它的底层结构和具体实现。

第7章:对如何使用基于AspectJ配置AOP的知识进行了深入的分析,这包括使用XML Schema配置文件、使用注解进行配置等内容。

第8章:介绍了Spring所提供的DAO封装层,这包括Spring DAO的异常体系、数据访问模板等内容。

第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。

第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有云遮雾罩的感觉。

第11章:讲解了如何使用Spring JDBC进行数据访问操作,我们还重点讲述了LOB字段处理、主键产生和获取等难点知识。

第12章:讲解了如何在Spring中集成Hibernate、myBatis等数据访问框架,同时,读者还将学习到ORM框架的混用和DAO层设计的知识。

第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。

第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。

第15章:对Spring MVC框架进行详细介绍,对REST风格编程方式进行重点讲解,同时还对Spring 3.0的校验和格式化框架如果和Spring MVC整合进行讲解。

第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。

第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、项目设计、代码开发、单元测试直到应用部署经历整个实际项目的整体开发过程。如何使用本书

读者应该在机器上安装MyEclipse 8.5,并下载Spring 3.0的最新发布包,在机器上重现书中实例的开发过程。毕竟程序开发是实践性极强的工作,只有亲身体验才能掌握其真谛。

配套光盘拥有本书所有实例的代码,读者也可以在此基础上重复本书的实例的开发过程,省去重新录入代码之苦。本书的插文

本书会适时加入一些提示、实战经验和轻松一刻的小段插文,在不打断行文的同时提供一些有益的开发经验、使用技巧并增强阅读的趣味性。这些插文都带有一个小图标加以突显,说明如下:

此外,由于Spring 3.x拥有多个版本,为了保持行文的简洁,除非特别指出,本书的Spring或Spring 3.0即代表当前最新的版本(Spring 3.1.x)。如何与作者联系

由于Spring内容涵盖面宽广,涉及的内容非常多,同时由于作者水平有限,错误之处在所难免。我们不但欢迎读者朋友来信交流,更期待各界高手、专家就不足之处给予赐教和斧正。您可以通过quickselect@yahoo.com.cn与笔者联系。陈雄华 厦门第1篇概述◆第1章 Spring概述◆第2章 快速入门第1章 Spring概述

Spring已经成为Java应用首选的full-stack开发框架,该框架本着“从实践中来,到实践中去”的原则,对传统EJB重量型框架的思想进行了颠覆式的革新,通过Rod Johnson天才般的演绎,使Spring在短短的时间内就成为用户众多、社群庞大、文档丰富、极具实用性的开源开发框架。Spring拥有一支活跃的开发队伍,功能的改进和版本的升级从来没有停止过。目前,Spring已经升级到3.0版本,Spring 3.0充分拥抱Java 5.0技术,核心API对泛型、可变入参等语言特性提供了全面的支持。Bean的配置得到了重大的升级,更加灵活和强大。此外还新增了SpEL、OXM、通用类型转换和属性格式化等功能,全面支持REST风格的Web开发。Spring家族系列的子项目更加丰富,特别是Spring在云计算、OSGI这些引领世界风潮的技术上拥有令人惊羡的表现。本章对Spring框架进行宏观性的概述,力图使读者建立起对Spring整体性的认识。

本章主要内容:

◆认识Spring

◆Spring体系及文档结构

◆Spring 3.0新特性

◆Spring的子项目

◆相似框架的介绍

本章亮点:

◆对Spring 3.0新特性进行分析

◆详细介绍Spring的第三方依赖类库

◆对Spring子项目进行点评1.1 认识Spring

Spring——春天,春风又绿江南岸的春天,花团锦簇,草长莺飞的春天。一提到近几年的Java开源世界,喜爱历史的人也许马上就能联想到春秋战国时期那段百花齐放、百家争鸣、思想文化空前繁荣的学术春天,而Spring正是百花齐放的Java开源世界里一朵芳香馥郁的奇葩。

Spring是众多Java开源项目中的一员,唯一不同的是:它秉承着破除权威迷信,一切从实践中来到实践中去的信念,宛如阿基米德手中的杠杆,以一己之力撼动了Java EE传统重量级框架坚如磐石的大厦。

要用一两句话总结出Spring所有内涵确实有点困难,但是为了先给大家一个基本的印象,我们尝试着进行以下概括:

Spring是分层的Java SE/EE应用一站式的轻量级开源框架,以IoC(Inverse of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,此外,Spring以海纳百川的胸怀整合了开源世界里众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。

说起Spring,我们不免要提到Spring的缔造者Rod Johnson这位Java奇才,Rod Johnson不仅在悉尼大学获得了计算机学士学位,同时还是一位音乐学的博士,也许是音乐的细胞赋予了他程序设计美学的灵感,让他成就了Spring的简约和优雅。他不但早在1996年就涉足了Java技术,同时也对C/C++有着深厚的造诣。他参与过众多保险、电子商务和金融等行业大型项目的开发,具有丰富的实践经验。同时他还是JCP活跃的成员,是JSR154(Servlet 2.4)和JDO 2.0规范的专家。

Rod Johnson在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世界的大师级人物。

从2004年发布第一个版本以来,Spring逐渐占据了Java开发人员的视线,获得了开源社区一片赞誉之声,开源社区里“春”城无处不飞花。在SourceForge开源网站上,仅Spring 1.2.8版本就被下载了20多万次。在国内著名的Java开发大全网站(http://www.open-open.com)上,Spring始终是众人关注的焦点,排名第二。

Spring拥有庞大的社区、活跃的开发队伍、丰富的文档、众多的应用案例。国内的Spring社区也异常活跃,对Spring在国内的推广起到了推波助澜的作用,下面是其中一些不得不提到的代表者。

首先提到的是SpringFramework中文论坛(http://spring.jactiongroup.net),这是一个出色的Spring专业论坛,在2008年,论坛组织和满江红开放技术研究组织(http://www.redsaga.com)联手快速并出色地完成了Spring开发手册的翻译工作,使众多国内Spring爱好者从中受益。

其次是SpringSide网站(http://www.springside.org.cn),该网站拥有国内众多优秀的Spring先行者,志在利用Spring打造出一个企业应用快速开发基础框架,并以实际项目展示Spring各项技术的整合和应用,为广大Spring爱好者提供一个受用的具体参考实例。

此外,面向高阶Java开发人员的Java视线论坛(http://www.iteye.com)是Spring爱好者极好的交流平台,众多无私的开发者慷慨地分享他们的开发心得和经验,为Spring在国内的推广做出了重大的贡献。

轻松一刻

在茶诗中,最有奇趣的要数回文诗。回文是利用汉语的词序、语法、词义灵活的特点构成的一种修辞方法。回文诗词有多种形式,如通体回文、就句回文、双句回文、本篇回文、环复回文等。《四时山水诗》是明末浙江才女吴绛雪所作的回文诗,它共包括春、夏、秋、冬四句就句回文诗,其中对应“春”的回文诗句是“莺啼岸柳弄春晴夜月明”,经回文拆解后每句诗都包括有一个“春”字,且很富诗意,颇具欣赏性。1.2 关于SpringSource

Rod Johnson不但是一位技术奇才,也是一位商业奇才。当Spring 1.0发布时,Rod就和他的骨干团队成立了SpringSource公司,以商业化的方式对开源的Spring进行动作。以Spring应用开源框架的为依托,成功开展了很多分别代表不同技术领域的子项目,将Spring的触角延伸到Web Service、安全、富客户端、OSGi等技术领域。同时通过这些子项目的探索不断改进和丰富Spring框架的内涵,使Spring的用户越来越多。

Rod不但注重Spring框架内功的打造,还很关注市场的推广和宣传,不间断地在世界各地进行宣传、培训和咨询服务。还像IBM、微软、红帽等公司一样开展技术认证的服务,找到了商业赢利的模式。

2007年5月,SpringSource吸引了著名的Benchmark Capital风险投资商(Benchmark成功投资过MySQL、RedHat和eBay等公司),Benchmark Capital提供了1千万美元的投资。后来,Benchmark还联合了Accel共同投资,后者在2008年年初提供了1500万美元的资金。

2008年,SpringSource收购了G2One——Groovy编程语言和Grails Web框架背后的公司,以及Covalent——为Apache的Tomcat应用服务器提供支持的公司。

2009年,SpringSource收购了开源系统监测厂商Hyperic,Hyperic的核心产品是Hyperic HQ,该产品提供了硬件和操作系统、虚机、数据库及应用服务器的可用性监测。SpringSource的核心业务是销售SpringSource企业版服务器,使用Hyperic产品后,就相当于配备了系统监测的测量仪器。SpringSource的最终的目标是借此在云计算市场拥有越来越多的话语权,这可以通过Rod的这句话证实:“云的兴起使得消除开发与运营之间的隔阂更为重要了。我们相信我们的中间件作为Java云技术的基础是最好的,而SpringSource/Hyperic组合将让我们能够以一种独一无二的方式消除开发者和运营者之间的隔阂。”

SpringSource一直致力于成为能够同时提供应用开发框架、应用服务器及应用服务监控的提供商。在收购Covalent和Hyperic之后,终于实现了这一宏图。更多的喜讯马上接踵而来:2009年8月11日,商业软件生产商VMWare宣布,斥资4.2亿美元收购SpringSource公司。这一消息无疑是2009年开源社区领域最重大的消息之一。合并后,VMWare和SpringSource计划共同开发集成化的平台即服务(Platformasa Service,PaaS)解决方案,期望它能应用于客户数据中心或被云服务提供商采用。1.3 Spring带给我们什么

也许有很多的开发者曾经被过度EJB的宣传所迷惑,成为EJB的拥趸者,并因此拥有一段痛苦的开发经历。EJB的复杂源于它对所有的企业应用采用统一的标准,它认为所有的企业应用都需要分布式对象、远程事务,因此造就了EJB框架的极度复杂。这种复杂不仅造成陡峭的学习曲线,而且给开发、测试、部署都造成了很多额外的要求和工作量。其中最大的诟病就是难于测试,因为这种测试不能脱离EJB容器,每次测试都需要进行应用部署并启动EJB容器,而部署和启动EJB是一项费时费力的重型操作,其结果是测试工作往往成为开发工作的瓶颈。

但EJB并非一无是处,它提供了很多可圈可点的服务,如声明事务、透明持久化等。Spring承认EJB中存在优秀的东西,只是它的实现太复杂、要求过严过高,所以Spring在努力提供类似服务的同时尽量简化开发,Spring认为Java EE的开发应该更容易、更简单。在实现这一目标时,Spring一直贯彻并遵守“好的设计优于具体实现,代码应易于测试”这一理念,并最终带给我们一个易于开发、便于测试而又功能齐全的开发框架。概括起来,Spring给我们带来以下的好处:

●方便解耦,简化开发

通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

●AOP编程的支持

通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

●声明式事务的支持

在Spring中,我们可以从单调烦闷的事务管理代码中解脱从来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

●方便程序的测试

可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。

●方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz等)的直接支持。

●降低Java EE API的使用难度

Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。

●Java源码是经典学习范例

Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践的范例。如果想在短时内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。1.4 Spring体系结构

Spring框架由1400多个类组成,整个框架按其所属功能可以划分为5个主要模块,如图1-1所示。图1-1 Spring框架结构

从整体看这5个主要模块几乎为企业应用提供了所需的一切,从持久层、业务层到展现层都拥有相应的支持。就像吕布的赤兔马和方天画戟、秦琼的黄骠马和熟铜锏,IoC和AOP是Spring所依赖的根本。在此基础上,Spring整合了各种企业应用开源框架和许多优秀的第三方类库,成为Java企业应用full-stack的开发框架。Spring框架的精妙之处在于:对于开发者拥有自由的选择权,Spring不会将自己的意志强加给开发者,因为针对某个领域问题,Spring往往支持多种实现方案。当希望选用不同的实现方案时,Spring又能保证过渡的平滑性。

●IoC

Spring核心模块实现了IoC的功能,它将类和类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述,由IoC容器负责依赖类之间的创建、拼接、管理、获取等工作。BeanFactory接口是Spring框架的核心接口,它实现了容器许多核心的功能。

Context模块构建于核心模块之上,扩展了BeanFactory的功能,添加了i18n国际化、Bean生命周期控制、框架事件体系、资源加载透明化等多项功能。此外,该模块还提供了许多企业级服务的支持,如邮件服务、任务调度、JNDI定位、EJB集成、远程访问等。ApplicationContext是Context模块的核心接口。

表达式语言模块是统一表达式语言(unified EL)的一个扩展,该表达式语言用于查询和管理运行期的对象,支持设置和获取对象属性,调用对象方法、操作数组、集合等。还提供了逻辑表达式运算、变量定义等功能。使用它就可以方便地通过表达式串和Spring IoC容器进行交互。

●AOP模块

AOP是继OOP之后,对编程设计思想影响最大的技术之一。AOP是进行横切逻辑编程的思想,它开拓了考虑问题的思路。在AOP模块里,Spring提供了满足AOP Alliance规范的实现,此外,还整合了AspectJ这种AOP语言级的框架。在Spring里实现AOP编程拥有众多的选择。Java 5.0引入java.lang.instrument,允许在JVM启动时启用一个代理类,通过该代理类在运行期修改类的字节码,改变一个类的功能,实现AOP的功能。

●数据访问和集成

任何应用程序,其核心的问题是对数据的访问和操作。数据有很多表现形式,如数据表、XML、消息等,而每种数据形式又拥有不同的数据访问技术(如数据表的访问既可以直接通过JDBC,也可以通过Hibernate或Ibatis)。

Spring站在DAO的抽象层面,建立了一套面向DAO层统一的异常体系,同时将各种访问数据的检查型异常转换为非检查型异常,为整合各种持久层框架提供基础。其次,Spring通过模板化技术对各种数据访问技术进行了薄层的封装,将模式化的代码隐藏起来,使数据访问的程序得到大幅简化。这样,Spring就建立起了和数据形式及访问技术无关的统一的DAO层,借助AOP技术,Spring提供了声明式事务的功能。

●Web及远程操作

该模块建立在Application Context模块之上,提供了Web应用的各种工具类,如通过Listener或Servlet初始化Spring容器,将Spring容器注册到Web容器中。其次,该模块还提供了多项面向Web的功能,如透明化文件上传、Velocity、FreeMarker、XSLT的支持。此外,Spring可以整合Struts、WebWork、Tapestry Web等MVC框架。

●Web及远程访问

Spring自己提供了一个完整的类似于Struts的MVC框架,称这为Spring MVC。据说Spring之所以也提供了一个MVC框架,是因为Rod Johnson想证明实现MVC其实是一项简单的工作。当然,如果你不希望使用Spring MVC,那么Spring对Struts、Tapestry等MVC框架的整合,一定也可以给你带来方便。相对于Servlet的MVC,Spring在简化Portlet的开发上也做了很多工作,开发者可以从中受益。

此外,Spring在远程访问以及Web Service上提供了对很多著名框架的整合。由于Spring框架的扩展性,特别是随着Spring框架影响性的扩大,越来越多框架主动地支持Spring框架,让Spring框架应用涵盖面越来越宽广。1.5 Spring 3.0的新功能

2009年9月发布Spring 3.0第一个候选版本,2009年12月正式发布了Spring 3.0版本,在本书撰写时(2011年1月)的最新版本是Spring 3.0.5。比之于Spring 2.x,有众多新功能被添加到Spring中:它基于Java 5.0语言特性,提供了EL(Expression Language,表达式语言)和REST的支持,同时还支持JSR-330(依赖注入)和JSR-303(Bean验证)的规范。在进入Spring具体内容的学习之前,有必要了解一下这些新功能。由于有些新功能可能是在Spring 3.0添加的,也有可能是在Spring 3.0.x等版本添加的,为了叙述方便,在一般情况下,我们统一称之为Spring 3.0。1.5.1 核心API更新到Java 5.0

在Spring 2.x中,其实我们已经可以看到这个趋势。当时Spring已经有很多类采用Java 5.0的语言特点,不过它们被谨慎地放到一个单独的tiger包中。鉴于当前基本上所有的Java应用都已采用Java 5.0开发,Spring 3.0顺应大势也将其核心API都更新到Java 5.0上,方便开发者的调用。

这个更新的最大标志是将核心API采用泛型和不定入参的特性。如BeanFactory的部分方法签名已经调整成如下形式:

●T getBean(Class requiredType)

●T getBean(String name, Class requiredType)

●Map getBeansOfType(Class type)

此外,Spring让TaskExecutor直接扩展java.util.concurrent.Executor的接口,在Spring 2.x中TaskExecutor则是一个独立的接口。AsyncTaskExecutor扩展于TaskExecutor,支持在一段时间后异步调用某个方法。

新增了一个用于类型转换的ConversionService接口,它是Spring 3.0新增类型转换系统的核心接口,其提供的方法都支持泛型。Spring 3.0使用类型转换系统替换掉原来标准JDK的JDK PropertyEditors。

最后,Spring的事件监听器也支持泛型,形如ApplicationListener。这样,只要指定事件的类型就可以监听某一类型的事件了。1.5.2 Spring表达式语言

在低版本时,很多Spring开发者迫切希望Spring添加的一个功能就是脚本化配置的能力。这个梦想在Spring 3.0中终于得到了实现。Spring提供的脚本称为SpEL,它和统一EL(Express Language)类似,但提供了更为强大的功能,如可以在Spring的XML配置文件或Spring配置的注解中使用。

这是一个很强大的功能,可以在Bean配置时和Java实例化对象进行交互,获取动态的特性。如你可以使用执行某个Bean的方法,让方法的返回值作为另一个Bean属性的值。

通过基于Eclipse的SpringSource Tool Suite,在IDE环境中可以获取表达式语言诱导的功能。更多关于SpEL的功能,我们将在第4章中讲解。来看一个使用SpEL的配置文件:

以上配置块中以#{}表示的部分就是使用了SpEL表达式的配置,它将调用bean1的相应方法为Bean2注入值。1.5.3 可通过Java类提供IoC配置信息

Spring拥有众多的子项目,Spring在升级时经常将那些成熟且广受欢迎的子项目整合到Spring主项目中。Spring JavaConfig是一个通过Java类提供Spring配置元信息的子项目,Spring 3.0已经将其纳入到Spring框架的核心模块中。

在早期版本中,Spring仅提供XML配置方式,在Spring 2.5中提供了基于注解的配置方式,在Spring 3.0中则提供了基于Java类的配置方式。这三种配置方式无非是形式上的区别,最终提供的都是Spring配置的元数据。Spring要提供这么多配置方式,并不是要用一种方式替换另一种方式,它们在不同的应用场景下将表现出各自的优势。所以你可能会同时使用到这三种方式。

下面是使用Java类进行配置的例子,它直接来自于Spring的开发指南。代码清单1-1 AppConfig

这个Java类通过Spring特定的注解,提供了配置的元数据信息,定义了Bean。它和XML或注解的配置方式相比,最大的优势是灵活!使用了@Bean的方法返回一个Bean,你可以通过代码决定要如何实例化这个Bean,而不像在XML中那样只能指定一个类名。1.5.4 通用类型转换系统和属性格式化系统

引入了一种通用的“类型转换系统”,Spring的SpEL目前使用该系统进行类型转换,也可以在Spring容器及DataBinder的Bean属性绑定时使用。在格式化Bean属性值时,引入了一套格式化的SPI接口,它比早期使用的JavaBean PropertyEditors更为强大易用。1.5.5 数据访问层新增OXM功能

来自于Spring Web Service项目的OXM(Object to XML,对象XML映射)已经被移到Spring的核心框架中,OXM类似于我们熟悉的ORM,它通过元数据描述对象和XML转换的映射。它对应的包是org.springframework.oxm。1.5.6 Web层的增强

Spring 3.0最令人振奋的一个增强是Spring MVC提供了对REST风格编程的支持。在服务端提供了一些易用的REST注解,在调用端则提供了RestTemplate模板类,服务端和调用端都通过HttpConverter进行对象和HTTP请求/响应的转换。

我们知道在Spring 2.5中引入了一套Spring MVC的注解,如@Controller,@Request Mapping等,Spring 3.0继续完善这一注解体系,新增了@CookieValue、@RequestHeaders的注解,可以直接绑定Cookie及请求报文头的数据。1.5.7 其他

●声明式模型验证:Spring 3.0对模型校验进行了很多的增强。首先,它全面支持JSR-303的Bean验证API;其次,可以使用Spring的DataBinder对Bean进行校验;最后,Spring MVC支持声明式验证。

●对JavaEE 6的支持:Spring 3.0可以使用@Async或EJB3.1的@Asynchronous注解异步地调用某个方法。此外,还支持JSR-303、JSF 2.0及JPA 2.0中的大部分功能。

●支持内嵌的数据库:提供便捷的方法支持内嵌数据库引擎,如HSQL、H2和Berby。1.6 Spring对Java版本的要求

Spring 3.0基于Java SE 5.0,全面支持Java SE 6.0。运行Spring 3.0必须使用JDK 5.0以上版本,如果要编译Spring 3.0则必须使用JDK 6.0。此外,Spring保持和J2EE 1.4及Java EE 5.0的兼容,同时也对Java EE 6.0提供一些早期的支持。1.7 如何获取Spring

在开始学习和使用Spring之前,必须先获取Spring的发布包。Spring在以下4个地方提供发布版本的下载。

●Spring下载社区:SpringSource自建的下载社区,不但提供Spring的下载,还提供SpringSource公司所有产品的下载。位于http://www.springsource.com/download/community,初次下载时,要填写一份下载者信息的表单,填写完成后,才转到下载页面。

●Maven中心:即Maven工具默认访问的仓库,许多Spring依赖的第三方类库也可以从这里获取。

●企业模块仓库(Enterprise Bundle Repository,EBR):由SpringSource公司自已维护的一个企业模块仓库,它类似于Maven的仓库。它拥有Spring所涉及的所有类库。不但可以被Maven使用,也可以被Ivy使用(来自于Apache的基于Ant的项目建模开源工具)。

●Maven公共仓库:位于Amazon S3服务器中,它用于项目开发快照及里程碑发布,也包括最终发布版。

如果使用Maven或Ivy构建Spring项目,那么可以通过配置文件引用Maven仓库或Spring企业模块仓库的模块类库。这里,我们直接从Spring下载社区获取Spring的发布包。登录http://www.springsource.com/download/community填写下载者信息并提交,到达下载社区页面,如图1-2所示。图1-2 Spring下载页面

下载版本对应以下两种发布类型。

●带with-docs.zip后缀:包括Spring的开发手册及JavaDoc文档,包括Spring模块项目和编译好的Spring模块类包,但未包含第三方类库,需要通过Ivy工具下载依赖类库。

●未带附件后缀:和带with-docs.zip后缀不同的是未带Spring的开发手册及JavaDoc文档。

建议直接下载带with-docs.zip后缀的发布文件,下载完成后,将其解压到一个目录下。Spring 3.0的目录层级很多且名称很长,由于在Windows系统中,目录及文件名组合的字符长度不能超过260个字符,所以为了避免解压失败,最好解压到根目录下(如D:\masterSpring\)。

Spring的发布包都不再附带例子项目,你可以通过SVN客户端工具(如TortoiseSVN)从https://anonsvn.springframework.org/svn/spring-samples下载。1.8 小结

全世界范围内成千上万的项目构建于Spring技术框架之上,Spring已然成为事实上标准的Java技术框架。它颠覆了传统Java开发笨重难用的学院派风格,给Java开发者带来了一股敏捷便利、灵活实用的编程之风。

Spring 3.0在Bean配置、OXM、动态语言、Spring MVC等方面进行了重大的内容升级,全面升级到Java 5.0版本上,且项目以当前流行的Maven方式进行组织,进一步加强了Spring在Java开源领域第一开源框架的领导地位。第2章 快速入门

本章通过一个简单的例子展现开发Spring Web应用的整体过程,通过这个实例,读者可以快速跨入Spring Web应用的世界。实例应用按持久层,业务层和展现层进行组织,从底层DAO程序到Web展现程序逐层演进,一步步地搭建起一个完整的实例。通过本章的学习,读者可以独立完成一个典型的基于Spring的Web应用。

本章主要内容:

◆用户登录实例介绍

◆基于Spring JDBC的持久层实现

◆基于Spring声明式事务的业务层实现

◆基于Spring MVC的展现层实现

◆在MyEclipse中开发Web应用的过程

◆运行Web应用

本章亮点:

◆非传统Hello World的快速入门实例

◆通过使用最广的MyEclipse IDE讲解开发的过程

◆详尽的开发过程,使读者快速上手2.1 实例功能概述

在进行实例具体开发步骤之前,有必要先对实例的功能进行概述,以便对要实现的实例有一个整体性的认识。2.1.1 比Hello World更适用的实例

为了让大家快速对Spring有一个切身的认识,没有什么比通过一个实际的例子更适合的了。Hello World是比较经典的入门实例,但我们觉得Hello World太过简单,很难展现Spring的全貌,为了让Spring的功能轮廓更加清晰,我们打算通过一个功能涵盖面更广的论坛登录模块替换经典的Hello World实例。之所以选择登录功能模块,出于以下三个原因:

1)大家对于登录模块的业务功能再熟悉不过了,无须在业务功能介绍上花费时间;

2)登录模块麻雀虽小,五脏俱全,它涵盖了持久层数据访问操作,业务层事务管理以及展现层MVC等企业应用常见的功能;

3)本书希望通过一个名为“宝宝淘”的论坛贯穿始终,以便能够由点及面,使读者在单纯技术性学习的酣战中深刻理解应用程序整体开发流程。

Spring拥有持久层、业务层和展现层的“原生技术”,分别是Spring JDBC、声明式事务和Spring MVC。为了充分展现Spring本身的魅力,在本章中我们仅使用Spring的这些原生技术,在以后的章节中,我们将对其他的持久层和展现层技术进行学习,只要用户愿意,就可以平滑地将其过渡到其他技术实现中。2.1.2 实例功能简介

论坛登录模块的功能很简单,首先登录页面提供一个带用户名/密码的输入表单,用户填写并提交表单后,服务端程序检查是否有匹配的用户名/密码。如果用户名/密码不匹配,返回到登录页面,并给出提示。如果用户名/密码匹配,记录用户的成功登录日志,更新用户的最后登录时间和IP并给用户增加5个积分,然后重定向到欢迎页面(图2-1)。图2-1 页面流程

在持久层拥有两个DAO类,分别是UserDao和LoginLogDao,在业务层对应一个业务类UserService,在展现层拥有一个LoginController类和两个JSP页面,分别是登录页面login.jsp和欢迎页面main.jsp。

下面通过一个时序图来描述论坛登录模块的整体交互流程(图2-2)。图2-2 登录模块整体流程

1.首先用户访问login.jsp,返回带用户名/密码表单的登录页面;

2.用户在登录页面输入用户名/密码,提交表单到服务器,Spring根据配置调用LoginController控制器响应登录请求;

3.LoginController调用UserService#hashMatchUser()方法,根据用户名和密码查询是否存在匹配的用户,UserService内部通过调用持久层的UserDao完成具体的数据库访问操作;

4.如果不存在匹配的用户,重定向到login.jsp页面,并报告错误,否则到下一步;

5.LoginController调用UserService#findUserByUserName()方法,加载匹配的User对象并更新用户最近一次登录时间和登录IP;

6.LoginController调用UserService#loginSuccess()方法,进行登录成功的业务处理:首先,调用UserDao#updateLoginInfo()为用户添加5个积分,然后创建一个LoginLog对象,并利用LoginLogDao将其插入到数据库中;

7.重定向到欢迎页面main.jsp,欢迎页面产生响应返回给用户。

实例的所有程序位于随书光盘chapter2的目录下,本章后面的内容将逐一实现以上步骤的功能,完成这个实例的所有细节。

轻松一刻

虽然本书很少采用foo和bar对变量进行命名,但相信大家对于这两个单词一定再熟悉不过了,它们是计算机图书中最常使用的变量名。不同的字典对foo的解释相去甚远,一说来自中国“福”字的发音,又有解释为二战时期的一种武器。将foo和bar组合在一起所构成的foobar应该最能反映其原始的意思:foobar又为foo-bar,其中bar是beyond all recognition的缩写,意为超越认知,通俗点就是无法识别、一塌糊涂的意思。而foo是fu的变体,fu是英语习语fuck-up的缩写,同样是一团糟的意思。2.2 环境准备

在进入实例的具体开发之前,需要做一些环境的准备工作,其中包括数据库表的创建、项目工程的创建、规划Spring配置文件等工作。我们使用MySQL 5.x数据库,如果用户机器中还未安装该数据库,可以从http://www.mysql.org/downloads下载并安装。也可以直接使用熟悉的数据库,只需要调整创建表的脚本并对数据库连接做相应配置就可以了。

提示

MySQL 4.1.0以前的版本不支持事务,MySQL 4.1.0本身也只是对事务提供有限的支持,Spring的各种声明式事务需要底层数据库的支持,所以最好安装5.0或更高版本的MySQL。2.2.1 创建库表

1.启动MySQL数据库后,用DOS命令窗口登录数据库:

分别指定用户名和密码,MySQL默认运行在3306端口,如果不是运行在默认端口,需要通过--port参数指定端口号。

2.运行以下脚本,创建实例对应的数据库:

数据库名为sampledb,默认字符集采用UTF-8。

3.创建实例所用的两张表:

t_user表为用户信息表;t_login_log为用户登录日志表。其中ENGINE=InnoDB指定了表的引擎为InnoDB类型,该类型表支持事务。MySQL默认采用MyISAM引擎,该类型表不支持事务,仅存储数据,优点在于读写很快。对于论坛型应用系统的表来说,其实大可使用不支持事务的MyISAM引擎,但本书出于演示事务的目的,所有表均采用支持事务的InnoDB引擎。

4.初始化一条数据,用户名为密码为admin/123456。

用户也可以通过直接运行脚本文件完成以上所有工作,创建数据库表的脚本文件位于chapter2/schema/sampledb.sql,下面提供了两种运行脚本的方法:

●直接通过mysql命令运行。

假设将光盘中的内容复制到D:\masterSpring目录下,则在DOS命令窗口下,运行以下命令:

●也可以在登录MySQL后,通过source命令运行脚本。2.2.2 建立工程

考虑到MyEclipse是使用最广的IDE,我们的例子也采用MyEclipse进行开发(采用8.5版本)。我们将MyEclipse的工作空间设置于D:\masterSpring,为了避免因路径不一致引起的各种问题,请尽量保证工作空间和本书的路径一致。光盘中的源文件和配置文件都使用UTF-8编码格式,UTF-8可以很好地解决国际化问题,同时避免不受欢迎的中文乱码问题,用户可以通过Window→Preferences→General→Workspace→Text file encoding将MyEclipse的工作空间编码格式设置为UTF-8,否则MyEclipse将采用操作系统默认的GBK编码格式。

在D:\masterSpring中建立一个名为chapter2的Web工程项目,选择Java EE 5.0,同时使用JSTL 1.1,如图2-3所示。图2-3 创建工程

创建项目工程后,将项目工程中需要的依赖类库添加到工程类路径中,如下所示:

其中,Spring低版本有提供完整的类包,但Spring 3.0都采用模块化的类包,如org.springframework.-.jar;在构建Spring后,第三方依赖类包缓存在ivy-cache目录下。commons-dbcp.jar为数据源类库;commons-pool.jar为对象池类库;commons-logging.jar和log4j.jar为日志类库;最后mysql.jar为MySQL数据库的驱动器类库;junit.jar为单元测试类库。2.2.3 类包及Spring配置文件规划

类包规划

类包以分层的方式进行组织,共划分为4个包,分别是dao、domain、service和web。领域对象从严格意义上讲属于业务层,但由于领域对象可能还同时被持久层和展现层共享,所以一般将其单独划分到一个包中(图2-4)。图2-4 包的规划

单元测试的类包和程序的类包对应,但放置在不同的文件夹下,本实例仅对业务层的业务类进行单元测试。将程序类和测试类放置在物理不同的文件夹下,方便将来程序的打包和分发,因为测试类仅在开发时有用,无须包含到部署包中。在本章的后续内容中,读者将会看到如何用Ant工具进行程序打包,体会这种包及目录的设计结构所带来的好处。

实战经验

随着项目规模的增大,这种仅以分层思想规划的包结构马上就会显示出它的不足,一般情况下需要在业务模块包下,进一步按分层模块划分子包,如user/dao、user/service、forum/dao、forum/service等。对于由若干独立的子系统组成的大型应用,在业务分层包的前面一般还需要加上子系统的前缀。包的规划对于大型的应用特别重要,它直接关系到应用部署和分发的方便性。

Spring配置文件规划

Spring可以将所有的配置信息统一到一个文件中,也可以放置到多个文件中。对于简单的应用来说,由于配置信息少,仅用一个配置文件就足以应付。随着应用规模的扩大,配置信息量的增多,仅仅使用一个配置文件往往难以满足要求,如果不进行仔细规划,将给配置信息的查看和团队协作带来负面影响。

配置文件在团队协作时是资源争用的焦点,对于大型的应用一般要按模块进行划分,以在一定程度上降低争用,减少团队协作的版本控制冲突。因此,我们的应用比较小,直接采用一个applicationContext.xml配置文件。2.3 持久层

持久层负责数据的访问和操作,DAO类被上层的业务类调用。Spring本身支持多种流行的ORM框架,我们将在本章的第三部分对此进行专门的讲解。这里,我们使用Spring JDBC作为持久层的实现技术,关于Spring JDBC的详细内容,请参见第10章的内容。为方便阅读,我们会对本章涉及的相关知识点进行必要的介绍,所以在不了解Spring JDBC的情况下,相信读者也可以轻松阅读本章的内容。2.3.1 建立领域对象

领域对象(Domain Object)也称为实体类,它代表了业务的状态,一般来说,领域对象属于业务层,但它贯穿展现层、业务层和持久层,并最终被持久化到数据库中。领域对象使数据库表操作以面向对象的方式进行,为程序的扩展带来了更大的灵活性。领域对象不一定等同于数据库表,不过对于简单的应用来说,往往领域对象都拥有对应的数据库表。

持久层的主要工作就是从数据库表中加载数据并实例化领域对象,或将领域对象持久化到数据表中。由于持久层需要用到领域对象,所以我们将本属于业务层的领域对象提前到持久层来说明。

论坛登录模块需要涉及两个领域对象:User和LoginLog,前者代

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载