Spring技术内幕:深入解析Spring架构与设计原理(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-28 19:48:53

点击下载

作者:计文柯

出版社:机械工业出版社

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

Spring技术内幕:深入解析Spring架构与设计原理(第2版)

Spring技术内幕:深入解析Spring架构与设计原理(第2版)试读:

前言

为什么要写这本书

本书探讨了Spring框架的设计原理、架构和运行机制。作为在Java领域最为成功的开源软件之一,Spring在Java EE开发中,使用者众多。本书以Spring的源代码为依托,结合Spring的设计思路,从内部实现的角度,对Spring的实现进行了翔实的分析,希望能够通过这种分析,使读者在开发者的层面掌握Spring,为开发Spring应用提供更扎实的框架基础。“忽如一夜春风来”,伴随着2002年Rod Johnson的《Expert One-on-One J2EE Design and Development》一书的出版而正式发布的Spring框架(也就是当年的interface21),经过这几年的发展,已经逐渐成熟起来。“吹面不寒杨柳风”,Spring带来的崭新开发理念,也早已伴随着它的广泛应用而“飞入寻常百姓家”。

与此同时,随着Spring的不断成熟和完善,开源社区的成长,以及Spring开发团队的不懈努力,以Spring为核心的一系列开源软件产品也越来越丰富,现已发展成为一个包括软件构建、开发、运行、部署整个软件生命周期的产品族群。Spring不但改变了Java EE应用的开发和服务模式,向纯商业软件发出了有力的挑战,同时也成为Java软件生态链中不可或缺的重要组成部分。它所具备的那种平易近人、内涵丰富的品质,对我们这些软件爱好者来说,实在是一个不可多得的学习范本。

简化Java企业应用的开发是Spring框架的目标。其轻量级的开发思想,为开发者提供便利的出发点(for the developer,to the developer and by the developer——这是Rod Johnson在一次演讲中的开场白),以及具有活力的开源社区,所有的这些,都为使用Java开发企业应用和Web应用带来了福音,这些都是Spring吸引我们的地方。

在Java企业应用中,与我们熟悉的企业应用服务器一样,Spring也希望能够集成管理企业应用资源,以及为应用开发提供平台支持。在这一点上,Spring与UNIX和Windows等传统意义上的操作系统,在计算系统中起到的作用是类似的。不同点在于,传统操作系统关心的是存储、计算、通信、外围设备等这些物理资源的管理,并在管理这些资源的基础上,为应用程序提供统一的平台和服务接口;而Spring关心的是,如何为开发者集中管理在Java企业应用和Web应用中涉及的数据持久化、事务处理、消息中间件、分布式计算等抽象资源,并在此基础上,为应用提供了一个基于POJO的开发环境。尽管二者面向的资源、管理的对象、支持的应用,以及使用的场景不同,但它们在整个计算系统中的定位,却有着可以类比和相互参考之处。所以,笔者根据对传统操作系统的认识方法,粗浅地把Spring框架划分为核心、组件和应用三个基本的层次,通过这三个层次中一些主要特性来剖析Spring的工作原理和运作机制。同时,也用这样的认识逻辑来组织本书中要阐述的内容。

在这样的层次划分中,首先看到的是对IoC容器和AOP这两个核心模块的工作原理的分析,它们都是Spring平台实现的核心部分;同时,它们也是Spring的其他模块实现的基础。虽然,对大多数开发者而言,都只是在此基础上进行相关的配置和外部功能的使用,但是,深入理解这两个核心模块的工作原理和运作机制,对于我们更好地应用Spring进行开发是至关重要的。因为,从Spring要简化Java EE开发的出发点来看,它是通过对POJO开发提供支持来实现的。具体地说,Spring通过为应用基于POJO的开发模式提供支持,从而使应用开发和复杂的Java EE服务实现解耦,并由此通过提高单元测试覆盖率(也就是应用系统的可测试性)来有效地提高整个Spring应用的开发质量。在这样的开发场景下,需要把为POJO提供支持的各种Java EE服务支持抽象到Spring应用平台中去,并将其封装起来。具体来说,这一系列的封装工作,在Spring及其应用实现中,离不开IoC容器和AOP这两个核心模块的支持,它们在很大程度上体现了Spring作为应用开发平台的核心价值。它们的实现是Rod Johnson在他的另外一本著作《Expert One-on-One J2EE Development without EJB》中所提到“Without EJB设计思想”的具体体现,同时,也深刻地体现了Spring背后的设计理念。

其次,在IoC容器和AOP这两个核心模块的支持下,Spring为了简化Java EE的开发,为应用开发提供了许多现成的用户态的系统组件,比如事务处理、Web MVC、JDBC、O/R映射、远端调用等,通过这些系统组件,为企业应用服务的实现提供驱动支持。这些由Spring或其生态系统(其本身、子项目或者社区)提供的,类似于驱动模块般的系统组件是开发应用时经常会用到的Java EE服务抽象。通过使用Spring提供的这些类似于驱动组件的中间产品,通过这一层Java EE服务的抽象,从而让用户可以通过使用简单的开发接口或应用模板,不但能够很方便地使用各种Java EE服务,还可以灵活地选取提供这些服务的各种不同的具体实现方案。让应用可以在各种第三方开源软件或者商业产品中自由选择,充分体现了Spring作为应用平台的开放性。

Spring作为一个开源项目,它本身就是一个开放的生态系统。对于和Spring相关的一些项目,可以把它们看做在某个领域的用户应用,因为它们是和Spring实现紧密相关的,或者它们本身就作为Spring框架的应用案例,体现了许多使用Spring的技巧。这些内容都是我们开发应用时的理想参考,并且会随着技术的发展而不断丰富,比如Spring DM、Spring FLEX、ACEGI安全性框架,以及Pet Clinic应用实例等。一方面,可以把这些实现作为应用的一个基本方案加以裁剪,以满足特定领域的需求;另一方面,通过剖析这些应用,可以为应用开发提供很好的参考和借鉴,提高应用开发的效率。

从更深层次的技术层面上来看,因为Spring是一个基于Java语言的应用平台,如果我们能够对Spring的运行环境Java计算模型(比如JVM的实现原理)有一些了解,将会加深我们对Spring实现原理的理解。反射机制、代理类、字节码技术等这些JVM特性,都是在Spring实现中会涉及的一些Java计算环境的底层技术。一般的应用开发人员可能不会直接从事与JVM底层实现相关的工作,但是,这些计算环境的底层知识对深入理解Spring是不可缺少的。

说了这么多,很多读者可能已经有些迫不及待了,只有对Spring的设计和实现身临其境地接触才是真实的,这里太多的文字已经成为一种累赘。本书将带领你到Spring核心设计这个茂密而又充满生机的源代码丛林中去一探究竟。在这里,你会惊奇地发现:这个过程就像是阅读优美的散文一样,是与开源软件开发者及开发者社区之间的一种畅快淋漓的交流,让人如痴如醉。

第1版与第2版的区别

本书是第2版,在写作过程中吸收了读者对上一版内容的许多意见和建议,比如着重增加了对Spring宏观框架和设计方面的阐述,加强了对Spring各种特性应用场景方面的描述,并结合了深入具体的源代码实现。希望通过这些改进,给读者一个从应用到设计再到实现的完整理解,弥补第1版中深度有余,内容层次不够丰富,分析手法单一等诸多不足。

较第1版而言,第2版的改动主要体现在以下几个方面,希望读者能够在阅读中体会。

在内容阐述方式上,对每一章的内容进行了调整和重新编排,基本按照“使用场景”、“设计和实现过程”、“源码实现”这样的逻辑来重新组织大部分内容。希望通过这样的组织方式,能够使读者以由表及里,由配置应用到设计实现,从抽象到具体的方式来了解Spring的各个模块,从而丰富对Spring各个层次的认识。

在基于实现源码分析的基础上,增加了许多对Spring设计的分析,这些设计分析主要包括:在各个Spring模块中,核心类的继承关系、主要接口设计、主要功能特性实现的对象交互关系等。在描述这部分内容时,大多以UML类图和时序图的方式给出,从而帮助读者对Spring的设计有一个直观的了解,而不至于一下子就深入到Spring源代码实现中去,导致只见树木不见森林,另一方面也可以改善对Spring源代码解读的学习曲线。同时,在设计分析的过程中,尽可能地对在Spring设计中使用到的一些典型设计模式进行提示,通过这种方式使读者可以体会到各种设计模式在Spring设计中的灵活运用;结合Spring的设计和实现为设计模式的运用提供一系列绝佳的实际案例,从而提高读者对软件设计的理解和设计模式的实际运用能力。

在具体内容的呈现上,对上一版的内容进行了一些调整,这些调整包括:增加了第1章,对Spring项目的概要情况进行了简要阐述;同时把第1版中的一些内容,比如源代码环境的准备、Spring发布包的构建、Spring IDE的基本使用,以及Pet Clinic应用实例的分析等内容,放到了附录部分进行阐述。除此之外,在这一版中,根据Spring项目的自身发展情况增加了一些新的内容,比如对Spring DM和Spring FLEX这两个模块的分析。通过对这些Spring模块的分析,一方面可以了解Spring的发展历程,丰富视野;另一方面,也可以看到Spring与时俱进的旺盛生命力。

读者对象

❑学习Java语言和Java EE技术的中高级读者

Spring是利用Java语言实现的,其很多特性的设计和实现都极其优秀,非常具有研究和参考价值。对这部分读者来说,不仅可以从本书中了解Spring的实现原理,还能通过Spring的设计原理和源代码实现,掌握大量的Java设计方法、设计模式、编码技巧和Java EE开发技术。

❑Spring应用开发人员

如果要利用Spring进行高级应用开发,抑或是相关的优化和扩展工作,仅仅掌握Spring的配置和基本使用是远远不够的,必须要对Spring框架的设计原理、架构和运作机制有一定的了解。对这部分读者而言,本书将带领他们全面了解Spring的设计和实现,从而加深对Spring框架的理解,提高开发水平。同时,本书可以作为他们定制和扩展Spring框架的参考资料。

❑开源软件爱好者

Spring是开源软件中的佼佼者,它在实现的过程中吸收了很多开源领域的优秀思想,同时也有很多值得学习的创新。尤为值得一提的是,本书分析Spring设计和实现的方式也许值得所有开源软件爱好者进行学习和借鉴。通过阅读本书,这部分读者不仅能领略到开源软件的优秀思想,还可以掌握分析开源软件源代码的方法和技巧,从而进一步提高使用开源软件的效率和质量。

❑平台开发人员和架构师

Spring的设计思想和体系结构、详细设计和源码实现都是非常优秀的,是平台开发人员和架构师们不可多得的参考资料。

如何阅读本书

本书主要内容分为三个部分,分别阐述了Spring的核心、组件和应用三个方面。在展开这三个部分的内容之前,第1章对Spring的项目情况和整体架构进行了简要的介绍,这一章就像一个热身活动,为本书的主要内容做铺垫,如果您已经很熟悉Spring的使用,这一章可以自行跳过,直接进入到下面三个主体部分的内容。

第一部分详细分析了IoC容器和AOP的实现,这部分内容是理解Spring平台的基础,适合对Spring的运行机理有深入了解需求的读者阅读。在对AOP实现模块的分析中涉及的一些JVM底层技术,也是读者需要具备的背景知识。

第二部分深入阐述了基于Spring IoC容器和AOP的Java EE组件在Spring中的实现。在这部分内容中可以看到,每一个组件实现的内容基本上都是相对独立的,读者可以结合自己的需求选读。如果对Spring Web MVC的实现感兴趣,可以阅读第4章;如果对Spring提供的数据库操作的实现机制感兴趣,可以阅读第5章;如果对Spring中提供的统一事务处理的实现感兴趣,可以阅读第6章;如果对Spring提供的各种不同的远端调用实现感兴趣,可以阅读第7章。

第三部分讲述了一些基于Spring的典型应用的实现。如果读者对在Spring应用中如何满足应用资源的安全性需求方面的内容感兴趣,可以阅读第8章,本章对为Spring应用提供安全服务的ACEGI框架的实现进行了分析,在深入了解这部分内容的基础上,读者可以根据自己的应用需求定制自己的安全系统。第9章分析了Spring DM的设计和实现,通过Spring DM,可以将Spring应用便利地架构到OSGi的框架上去。第10章分析了Spring Flex的设计和实现,为使用Adobe Flex作为应用前端架构的Spring应用提供参考。

阅读本书时,建议读者在自己的计算机中建立一个源代码阅读环境,这样一方面可以追踪最新的源代码实现,另一方面,可以在阅读的过程中进行各种方式的索引和动手验证,加深对开源软件开发方式的体会。关于如何建立Spring的源代码环境,进行Spring项目的构建,通过IDE阅读源代码的基本方法等,感兴趣的读者可以参考本书附录中的内容。

在附录A、B、C中,对如何建立Spring项目环境进行了简要介绍,这部分内容包括如何获取Spring项目的源代码,如何构建Spring的发布包,如何使用Spring IDE工具等。这些知识不但适用于建立Spring的源代码研究环境,还适用于其他的Java开源项目,有一定的普遍性和参考价值。对于不同的Java开源项目,其使用的源代码管理工具、代码仓库的位置、权限配置会有所不同,但是,整个源代码的获取过程与获取Spring源代码的过程是类似的,整个构建过程也与Spring的构建方式大体相似,是非常值得我们参考的。

在附录D中,对伴随Spring项目的应用实例Pet Clinic进行了分析,这个应用实例为Spring应用开发提供了一个现实的使用案例,虽然简单,却相对完整。这个应用实例本身也是Spring团队的作品,是Spring项目发布的一部分,其中为我们更好地使用Spring提供参考。

勘误和支持

由于作者对Spring的认知水平有限,再加上写作时的疏漏,书中还存在许多需要改进的地方。在此,欢迎读者朋友们指出书中存在的问题,并提出指导性意见,不甚感谢。如果大家有任何与本书相关的内容需要与我探讨,可以发邮件到jiwenke@gmail.com,也可以加入本书微群q.weibo.com/943166,我会及时给予回复。最后,衷心地希望本书能给大家带来帮助,并祝大家阅读愉快!

致谢

感谢互联网,感谢开源软件,感谢Java,感谢Spring,感谢我们的社区,让我体验到如此美妙的开放氛围,体会到开源软件如此独特的魅力!好了,不多说了,笔者真诚地希望通过本书为你打开一个小小的入口,曲径通幽,通过这个入口,让我们一起在由开源软件和互联网构成的美丽风景中快乐地旅行!计文柯(Wenke J)第1章Spring的设计理念和整体架构

横看成岭侧成峰,远近高低各不同。

不识庐山真面目,只缘身在此山中。——【宋】苏轼《题西林壁》

本章内容

❑Spring的各个子项目

❑Spring的设计目标

❑Spring的整体架构

❑Spring的应用场景1.1 Spring的各个子项目

打开Spring社区网站http://www.springsource.org,我们可以看到围绕Spring核心构建出的一个丰富的平台生态系统。在这个平台生态系统中,除了Spring本身,还有许多值得注意的子项目。对Spring应用开发者来说,了解这些子项目,可以更好地使用Spring,或者说,可以通过阅读这些子项目的实现代码,更深入地了解Spring的设计架构和实现原理。这里将会对Spring的各个子项目进行简要的介绍。首先,在SpringSource的官方社区网站中单击Project链接,这时就可以看到Projects下拉列表中列出的各个子项目的项目链接,如图1-1所示。图 1-1 Projects下拉列表中的Spring子项列表

下面对Spring的主要子项目情况进行简要介绍,帮助读者熟悉Spring的整个生态系统的情况。

❑Spring Framework(Core):这是我们熟知的Spring项目的核心。Spring Framework(Core)中包含了一系列IoC容器的设计,提供了依赖反转模式的实现;同时,还集成了AOP功能;另外,在Spring Framework(Core)中,还包含了其他Spring的基本模块,比如MVC、JDBC、事务处理模块的实现。这些模块的详细设计和实现,会在本书后续章节中详细阐述。

❑Spring Web Flow:原先的Spring Web Flow是一个建立在Spring MVC基础上的Web工作流引擎。随着其自身项目的发展,Web Flow比原来更为丰富,Spring Web Flow定义了一种特定的语言来描述工作流,同时高级的工作流控制器引擎可以管理会话状态,支持AJAX来构建丰富的客户端体验,并且提供对JSF的支持。如图1-2所示是Spring Web Flow的架构图,通过这个图,我们可以了解到,Spring Web Flow实际上是构建在Spring MVC基础上的,是相对于Spring Framework(Core)独立发展的。图 1-2 Spring Web Flow的架构图

❑Spring BlazeDS Integration:这是一个提供Spring与Adobe Flex技术集成的模块,大家应该都领略过使用Flex技术做前端展现的绚丽效果。在现实的应用开发中,如果使用Flex作为前端,那么后端怎样和服务器端集成才能正好成为利用Java EE技术构建的后端呢?Spring BlazeDS Integration简化了这种集成工作,特别是对后端应用由Spring来构建的情况,正是Spring BlazeDS大显身手的场合了。在Spring BlazeDS Integration项目中,为Flex前端和后台的通信提供了和Spring开发模式一致的编程模型。在这个项目中,实际上使用了BlazeDS这个由Adobe提供的模块,这个BlazeDS模块实现了Flex前端展现和服务器后端处理的通信机制。在这个实现的基础上,Spring BlazeDS Integration进行了进一步的封装,让这个模块的使用更像是由一个受Spring IoC容器管理的Bean。

❑Spring Security:是广泛使用的基于Spring的认证和安全工具,就是先前在Spring社区中久负盛名的Acegi框架,Spring的老用户对这个框架都不陌生——这是一个自发的由Spring的爱好者发起的安全框架,其目标是为Spring应用提供一个安全服务,比如用户认证、授权等。可以说,没有这样一个框架,很多Spring应用的开发是很难成为一个完整应用的,因为框架是构建用户管理的核心和基础。Spring Acegi由Spring团队接手后,在2006年发行了稳定的1.0正式版,虽然是基于Acegi框架的,但是Spring Security已经在原有基础上增加了许多的新特性。关于这个框架的架构和具体实现,本书的后续章节会进行详细介绍。

❑Spring Security OAuth:这个项目为OAuth在Spring上的集成提供支持。OAuth是一个第三方的模块,提供一个开放的协议的实现,通过这个协议,前端桌面应用可以对Web应用进行简单而标准的安全调用。

❑Spring Dynamic Modules:可以让Spring应用运行在OSGi的平台上。我们知道,通过使用OSGi平台,增加了应用在部署和运行时的灵活性,Eclipse就是构建在OSGi的平台上,通过这个项目,可以在OSGi平台上方便地运行Spring应用。

❑Spring Batch:提供构建批处理应用和自动化操作的框架,这些应用的特点是不需要与用户交互,重复的操作量大,对于大容量的批量数据处理而言,这些操作往往要求较高的可靠性。Spring Batch的架构如图1-3所示。图 1-3 Spring Batch的架构图

❑Spring Integration:体现了“企业集成模式”的具体实现,并为企业的数据集成提供解决方案。Spring Integration为企业数据集成提供了各种适配器,通过这些适配器来转换各种消息格式,并帮助Spring应用完成与企业应用系统的集成。

❑Spring AMQP:是为Spring应用更好地使用基于AMQP(高级消息队列协议)的消息服务而开发的,使在Spring应用中使用AMQP消息服务器变得更为简单。这个项目支持Java和.NET两个版本。SpringSource旗下的Rabbit MQ就是一个开源的基于AMQP的消息服务器,Rabbit MQ是用Erlang语言开发出来的。

❑Spring.NET:如果想在.NET环境中也像在Java环境中使用Spring一样为应用开发带来便利,那应该怎么办?可以考虑使用Spring.NET项目,这是Spring在.NET环境中的移植,.NET开发人员通过它可以在.NET环境中使用Spring的IoC容器,以及AOP这些在Java开发中被大家熟知的特性。希望通过Spring.NET项目,能够简化.NET的应用开发。

❑Spring Android:为Android终端开发应用提供Spring的支持,它提供了一个在Android应用环境中工作,基于Java的REST客户端。

❑Spring Mobile:Spring Mobile和Spring Android不同,它能使工作在Spring传统的服务器端完成。它是基于Spring MVC构建的,为移动终端的服务器应用开发提供支持,比如,使用Spring Mobile可以在服务器端自动识别连接到服务器的移动终端的相关设备信息,从而为特定的移动终端实现应用定制。

❑Spring Social:是Spring框架的扩展,可以帮助Spring应用更方便地使用SNS(Social Network Service),例如FaceBook和Twitter这些服务的使用等。

❑Spring Data:该项目为Spring应用提供使用非关系型数据的能力,比如,当基础数据并非存储在关系数据库中时,又如Map-Reduce中的分布式存储、云计算存储环境等。Spring应用可以考虑使用Spring Data来操作这种类型的数据。1.2 Spring的设计目标

如果我们要简要地描述Spring的设计目标,可以这么说,Spring为开发者提供的是一个一站式的轻量级应用开发框架(平台)。作为平台,Spring抽象了我们在许多应用开发中遇到的共性问题;同时,作为一个轻量级的应用开发框架,Spring和传统的J2EE开发相比,有其自身的特点。通过这些自身的特点,Spring充分体现了它的设计理念:在Java EE的应用开发中,支持POJO和使用JavaBean的开发方式,使应用面向接口开发,充分支持OO(面向对象)的设计方法。

比如,在Java EE应用开发中,传统的EJB开发需要依赖按照J2EE规范实现的J2EE应用服务器。我们的应用在设计,特别是实现时,往往需要遵循一系列的接口标准,才能够在应用服务器的环境中得到测试和部署。这种开发方式,使应用在可测试性和部署上都会受到一些影响。Spring的设计理念采用了相对EJB而言的轻量级开发思想,即使用POJO的开发方式,只需要使用简单的Java对象或者JavaBean就能进行Java EE开发,这样开发的入门、测试、应用部署都得到了简化。

另一方面,在我们的应用开发中,往往会涉及复杂的对象耦合关系,如果在Java代码中处理这些耦合关系,对代码的维护性和应用扩展性会带来许多不便。而如果使用Spring作为应用开发平台,通过使用Spring的IoC容器,可以对这些耦合关系(对Java代码而言)实现一个文本化、外部化的工作,也就是说,通过一个或几个XML文件,我们就可以方便地对应用对象的耦合关系进行浏览、修改和维护,这样,可以在很大程度上简化应用开发。同时,通过IoC容器实现的依赖反转,把依赖关系的管理从Java对象中解放出来,交给了IoC容器(或者说是Spring框架)来完成,从而完成了对象之间的关系解耦:原来的对象-对象的关系,转化为对象-IoC容器-对象的关系,通过这种对象-IoC容器-对象的关系,更体现出IoC容器对应用的平台作用。

作为应用平台,Spring是怎样实现它的平台功能的呢?我们知道,在Java企业应用中,使用J2EE应用服务器可以开发出符合企业信息化需求的软件应用,其实,在这种应用场景下,可以将J2EE应用服务器看成是Java EE应用开发的平台,只是这个平台的设计是从J2EE的技术规范出发的,所以对使用者来说,对技术的理解和要求相对较高。对于Spring来说,它的定位也是在Java企业应用中,与我们熟知的J2EE服务器一样,起到一个应用平台和开发框架的作用;同时希望能够集成管理企业应用需要用到的资源,以及为企业应用开发提供平台支持,但因为设计的出发点不同,所以在推广和使用上更有优势。

作为应用平台,Spring与UNIX/Windows这样传统意义的操作系统在计算机系统中的作用类似,即作为用户和机器之间的平台,同时也为用户使用底层的机器资源提供了应用开发环境。不同点只在于,操作系统关心的是对存储、计算、通信、外围设备等物理资源的管理,并在管理这些资源的基础上,为用户提供一个统一的服务接口;而对于像Spring这样的Java EE企业应用开发而言,其关心的是一些企业应用资源的使用,比如数据的持久化、数据集成、事务处理、消息中间件、Web2.0应用、分布式计算等对高效可靠处理企业数据方法的技术抽象。具体来说,在J2EE开发中,EJB提供了一种模式,而Spring提供了另一种POJO的开发模式,虽然开发模式不同(也就是使用具体资源的模式不同,但出发点却都是一样的),但其整体地位和前面提到的操作系统有不少可以类比的地方。

从理解应用开发和应用平台两者关系的角度出发,可以让我们换一种视角来体会Spring的设计理念,笔者认为,在对Spring的内部设计进行分析时,也可以依据对传统操作系统的认知方法(算是找一个大家都熟知的参考模型来帮助我们理解Spring吧),在设计上把Spring划分为核心、组件和应用3个基本的层次。希望这种划分能够帮助大家在深入了解Spring设计的时候,对一些具体的模块有一个大致的定位和参考。

在这样的层次划分中,我们首先会看到,Spring体系的核心,类似操作系统的Kernel,即IoC容器和AOP模块。对于操作系统的Kernel来说,进程调度器的设计是其关键部分,通过进程调度器,一方面使用“进程”这个概念来抽象物理的计算资源,另一方面,可以通过调度算法的设计来实现对计算资源的高效使用。对Spring来说,也是一样的,一方面,它通过IoC容器来管理POJO对象,以及它们相互之间的耦合关系,使企业的信息(数据)资源可以用简单的Java语言来抽象和描述;另一方面,可以通过AOP,以动态和非侵入式的方式来增强服务的功能。所以,我们可以把IoC容器和AOP模块看做Spring的Kernel,是平台实现的核心部分。作为核心,它们代表了最为基础的底层抽象,同时也是Spring其他模块实现的基础。虽然作为使用者的我们大多数是开发者,只是在这两个模块的基础上进行相关的配置和使用,但是如果能够了解这两个核心模块的设计和实现,就像了解Linux核心的实现一样,毫无疑问,会让我们对整个平台的了解更上一层楼,对平台的认识也更为全面和系统。

另外,在Spring体系中,我们还会看到,在IoC和AOP这两个核心模块的支持下,Spring简化了Java EE所进行的开发。这种简化是指,我们能够不在EJB这么厚重的环境中使用Java EE的基本服务——为应用开发提供了许多即开即用的系统组件和服务,这些服务涵盖了Java EE各个基本服务,对于其他的服务,也可以根据使用情况动态扩展到Spring体系中(只要依据IoC和AOP所约定好的特定模式)。基本说来,Spring体系中已经可以包括我们在应用开发中经常用到的许多服务了,比如事务处理、Web MVC、JDBC、ORM、远端调用,从对用户的价值上来说,这些服务相对来说是不可忽视的,因为就算有了一个Kernel,打个比方,如果Linux没有实现许多驱动,Linux这个操作系统对用户来说也是没有价值的。设想一下,对于一个用户,只有一个光秃秃的Linux Kernel拿到手里,显卡驱动没有,键盘和鼠标的驱动没有,桌面系统没有,这样的系统能使用吗?这样的平台对一般的用户来说有价值吗?同样的道理,对Spring来说,有了IoC和AOP就相当于有了Spring的Kernel,但如果没有我们前面提到的那些即开即用的服务,Spring的应用和推广还会遇到很大的障碍。不过值得庆幸的是,Spring通过社区和自己的努力,提供了这些看起来不起眼,却对推广起着关键作用的部分,从而构建出一个丰富的生态系统。也许,这就暗示了interface21和Spring项目之间重要的不同之处。由此可以看到,这些由Spring或者其生态系统提供的,类似于驱动模块的系统组件,也是Spring平台的有机组成部分,通过这部分组件提供了很多简单的即开即用的Java EE服务抽象,从而使应用在通过POJO来进行具体开发时,得到Java EE服务的有力支持,使应用可以更关注应用的领域问题,更关注业务逻辑。同时,由于Spring使用IoC容器和AOP这样的核心模块来构建这些服务抽象和应用,它们本身的松耦合设计理念,可以让应用通过使用简单的开发接口或现成的应用模板,就可以方便地使用这些Java EE服务。不但如此,由于这些服务是通过IoC容器和AOP核心模块来提供的,对用户而言,绑定的是IoC容器和AOP模块,也就是说绑定的是IoC容器/AOP模块的使用接口,而不是绑定具体的Java EE服务,也为应用灵活地选取不同的服务实现提供了基础。比如,根据应用需求,用户可以选择Hibernate作为ORM工具,也可以使用iBatis,还可以使用其他的类似工具。这些不同工具和底层服务具体实现的选择都不影响应用的架构设计,这也体现了Spring的设计理念——面向接口开发而不依赖于具体的产品实现。

作为一个开源项目,就像Linux一样,Spring本身也依靠开源社区的力量,形成了一个开放的生态系统,开源的特性也深深影响了Spring的体系设计。在Spring的发展中,其本身就吸收了不少社区的好项目,比如Spring的Security框架就是来源于一个社区贡献Acegi。这个项目原意是为Spring应用设计的一个安全框架,让Spring应用更方便地处理一些安全性的问题,但随着应用的推广,慢慢也被吸收到Spring项目中去,成为一个Spring的子项目,虽然不是Spring Framework的一个部分,但也是在应用开发中经常使用到的。另外,随着技术和应用的发展,Spring也在对其他的技术提供支持,比如对Android移动应用开发的支持,对Adobe Flex前端应用的支持,对OSGi应用的支持等,这些都让以Spring为基础构建的Spring生态圈更加繁荣。

在对Spring的应用过程中,我们没有看到许多在J2EE开发中经常出现的技术规范,相反的是,在Spring的实现中,我们直接看到了许多Java虚拟机特性的使用,这和Spring提倡的POJO的开发理念是密不可分的,了解这一点,也可以帮助我们加深对Spring设计理念的认识。在Spring的设计中,实现AOP就采用了多种方式,比如它集成了AspectJ框架,同时也有ProxyFactory这种代理工厂的模式,而在代理工厂的实现中,既有直接使用JVM动态代理Proxy的实现,也有使用第三方代理类库CGLIB的实现。在设计上,这些特点很好地展示了Spring循证式开发的实用主义设计理念,这些理念和实现,同时也是我们开发Java EE应用很好的参考。1.3 Spring的整体架构

了解了Spring的设计理念之后,我们继续介绍Spring的整体架构。在Spring中,我们大致按照一个参考关系,将其划分为几个层次,比如IoC容器、AOP核心模块、封装的Java EE服务、作为中间的驱动组件、其他作为上层的应用,这些应用不但包括来源于社区的应用封装,如ACEGI,也包括使用Spring作为平台开发出来的各种类型的企业应用。

从技术上看,Spring是封装得很清晰的一个分层架构,可以参考如图1-4所示的Spring架构图。图 1-4 Spring架构图

在这个架构图中,我们可以看到以下的Spring基本组成模块。

❑Spring IoC:包含了最为基本的IoC容器BeanFactory的接口与实现,也就是说,在这个Spring的核心包中,不仅定义了IoC容器的最基本接口(BeanFactory),也提供了一系列这个接口的实现,如XmlBeanFactory就是一个最基本的BeanFactory(IoC容器),从名字上可以看到,它能够支持通过XML文件配置的Bean定义信息。除此之外,Spring IoC容器还提供了一个容器系列,如SimpleJndiBeanFactory、StaticListableBeanFactory等。我们知道,单纯一个IoC容器对于应用开发来说是不够的,为了让应用更方便地使用IoC容器,还需要在IoC容器的外围提供其他的支持,这些支持包括Resource访问资源的抽象和定位等,所有的这些,都是这个Spring IoC模块的基本内容。另外,在BeanFactory接口实现中,除了前面介绍的像BeanFactory那样最为基本的容器形态之外,Spring还设计了IoC容器的高级形态ApplicationContext应用上下文供用户使用,这些ApplicationContext应用上下文,如FileSystemXmlApplicationContext、ClassPathXmlApplicationContext,对应用来说,是IoC容器中更面向框架的使用方式,同样,为了便于应用开发,像国际化的消息源和应用支持事件这些特性,也都在这个模块中配合IoC容器来实现,这些功能围绕着IoC基本容器和应用上下文的实现,构成了整个Spring IoC模块设计的主要内容。

❑Spring AOP:这也是Spring的核心模块,围绕着AOP的增强功能,Spring集成了AspectJ作为AOP的一个特定实现,同时还在JVM动态代理/CGLIB的基础上,实现了一个AOP框架,作为Spring集成其他模块的工具,比如TransactionProxyFactoryBean声明式事务处理,就是通过AOP集成到Spring中的。在这个模块中,Spring AOP实现了一个完整的建立AOP代理对象,实现AOP拦截器,直至实现各种Advice通知的过程。在对这个模块的分析中可以看到,AOP模块的完整实现是我们熟悉AOP实现技术的一个不可多得的样本。

❑Spring MVC:对于大多数企业应用而言,Web应用已经是一种普遍的软件发布方式,而在Web应用的设计中,MVC模式已经被广泛使用了。在Java的社区中,也有很多类似的MVC框架可以选择,而且这些框架往往和Web UI设计整合在一起,对于定位于提供整体平台解决方案的Spring,这样的整合也是不可缺少的。Spring MVC就是这样一个模块,这个模块以DispatcherServlet为核心,实现了MVC模式,包括怎样与Web容器环境的集成,Web请求的拦截、分发、处理和ModelAndView数据的返回,以及如何集成各种UI视图展现和数据表现,如PDF、Excel等,通过这个模块,可以完成Web的前端设计。

❑Spring JDBC/Spring ORM:在企业应用中,对以关系数据库为基础的数据的处理是企业应用的一个重要方面,而对于关系数据库的处理,Java提供了JDBC来进行操作,但在实际的应用中,单纯使用JDBC的方式还是有些繁琐,所以在JDBC规范的基础上,Spring对JDBC做了一层封装,使通过JDBC完成的对数据库的操作更加简洁。Spring JDBC包提供了JdbcTemplate作为模板类,封装了基本的数据库操作方法,如数据的查询、更新等;另外,SpringJDBC还提供了RDBMS的操作对象,这些操作对象可以使应用以更面向对象的方法来使用JDBC,比如可以使用MappingSqlQuery将数据库数据记录直接映射到对象集合,类似一个极为简单的ORM工具。除了通过Spring JDBC对数据库进行操作外,Spring还提供了许多对ORM工具的封装,这些封装包括了常用的ORM工具,如Hibernate、iBatis等,这一层封装的作用是让应用更方便地使用这些ORM工具,而不是替代这些ORM工具,比如可以把对这些工具的使用和Spring提供的声明式事务处理结合起来。同时,Spring还提供了许多模板对象,如HibernateTemaplate这样的工具来实现对Hibernate的驱动,这些模板对象往往包装使用Hibernate的一些通用过程,比如Session的获取和关闭、事务处理的关联等,从而把一些通用的特性实现抽象到Spring中来,更充分地体现了Spring的平台作用。

❑Spring事务处理:Spring事务处理是一个通过Spring AOP实现自身功能增强的典型模块。在这个模块中,Spring把在企业应用开发中事务处理的主要过程抽象出来,并且简洁地通过AOP的切面增强实现了声明式事务处理的功能。这个声明式事务处理的实现,使应用只需要在IoC容器中对事务属性进行配置即可完成,同时,这些事务处理的基本过程和具体的事务处理器实现是无关的,也就是说,应用可以选择不同的具体的事务处理机制,如JTA、JDBC、Hibernate等。因为使用了声明式事务处理,这些具体的事务处理机制被纳入Spring事务处理的统一框架中完成,并完成与具体业务代码的解耦。在这个模块中,可以看到一个通用的实现声明式事务处理的基本过程,比如怎样配置事务处理的拦截器,怎样读入事务配置属性,并结合这些事务配置属性对事务对象进行处理,包括事务的创建、挂起、提交、回滚等基本过程,还可以看到具体的事务处理器(如DataSourceTransactionManager、HibernateTransactionManager、JtaTransactionManager等)是怎样封装不同的事务处理机制(JDBC、Hibernate、JTA等)的。

❑Spring远端调用:Spring为应用带来的一个好处就是能够将应用解耦。应用解耦,一方面可以降低设计的复杂性,另一方面,可以在解耦以后将应用模块分布式地部署,从而提高系统整体的性能。在后一种应用场景下,会用到Spring的远端调用,这种远端调用是通过Spring的封装从Spring应用到Spring应用之间的端到端调用。在这个过程中,通过Spring的封装,为应用屏蔽了各种通信和调用细节的实现,同时,通过这一层的封装,使应用可以通过选择各种不同的远端调用来实现,比如可以使用HTTP调用器(以HTTP协议为基础的),可以使用第三方的二进制通信实现Hessian/Burlap,甚至还封装了传统Java技术中的RMI调用。

❑Spring应用:从严格意义上来说,这个模块不属于Spring的范围。这部分的应用支持,往往来自一些使用得非常广泛的Spring子项目,或者该子项目本身就可以看成是一个独立的Spring应用,比如为Spring处理安全问题的Spring ACEGI后来转化为Spring子项目的Spring Security OAuth等。这个Spring应用支持的部分还有一个重要的组成,那就是包括了其他的一些模块,这些模块提供了许多Spring应用与其他技术实现的相关接口,比如与各种J2EE实现规范的接口,对JMS、JNID、JMX、JavaMail等的支持,Spring应用和Flex前端的接口,Spring应用移植到OSGi平台上运行的接口。通过这个模块的支持,使Spring应用可以便利和简洁地容纳第三方的技术实现,不但丰富了Spring应用的功能,而且丰富了整个Spring生态圈,使Spring应用得越来越广泛。1.4 Spring的应用场景

通过介绍Spring架构设计,我们了解到Spring是一个轻量级的框架。在Spring这个一站式的应用平台或框架中,其中的各个模块除了依赖IoC容器和AOP之外,相互之间并没有很强的耦合性。Spring的最终目标是简化应用开发的编程模型。它所提供的服务,可以贯穿应用到整个软件中,从最上层的Web UI到底层的数据操作,到其他企业信息数据的集成,再到各种J2EE服务的使用,等等。这些企业应用服务,Spring都通过其特有的IoC容器和AOP模块实现。在实现过程中,Spring没有把这种复杂性转换成自己被使用的复杂性,这点无疑是成功的,同时大大拓宽了Spring的应用场景。一方面,我们可以把Spring作为一个整体来使用,另一方面,也可以各取所需,把Spring的各个模块拿出来独立使用,这取决于我们对Spring提供服务的具体需求。例如,这些需求可能来自一个完整的Java EE企业应用开发需求,可以仅使用Spring的某些模块,如IoC容器。再如,我们可以使用Spring集成其他的J2EE服务,如JavaMail、JMS、JNDI等,还可以在Android应用环境,甚至在.NET应用环境中使用Spring。使用Spring的时候,可以采用各种不同的方式,而对于这些方式的选择,完全是由应用来决定的。因而,在对Spring的使用中,我们看到应用很少依赖于Spring特有的API,同时,由于Spring本身的设计也是非常模块化的,这样,就为应用开发提供了EJB开发不曾提供的便利。

在Java EE企业应用开发中,我们了解了使用Spring最为基本的场景,也就是使用大家熟知的SSH架构来完成企业应用开发,从而取代传统的EJB开发模式。在SSH架构中,Struts作为Web UI层、Spring作为中间件平台、Hibernate作为数据持久化工具(ORM工具)来操作关系数据库。如果我们使用的是Apache Tomcat、MySQL数据库和Linux环境,这就是一个完整的使用开源软件搭建企业应用的典型案例,对于应用开发来说,这样的架构组合是非常有吸引力的,因为这个架构的使用基本上没有什么License的费用,而且利用其进行开发的人员众多,已经成为Java应用开发中的主流技术。在这个架构中,Hibernate是一个独立的ORM数据持久化产品,目前是JBOSS/RedHat产品组合的一员,是一款著名的Java开源软件产品,使用者众多。比较Spring JDBC和Hibernae对数据库操作的支持,对Spring来说,其对数据持久化的支持,虽然也有JDBC的封装,可以完成一些将简单的数据记录到Java数据对象的转换和映射工作,但和Hibernate相比,功能上毕竟还是有一些单薄,比如Hibernate还提供了各种数据的查询、方便的对象和关系数据的映射等。因此,在大多数应用中,将Hibernate和Spring一起使用是非常普遍的,因为一方面Hibernate提供了完整的和已经成为事实标准的ORM功能,另一方面,Spring也提供了与Hibernated的集成和封装,包括声明式事务处理的封装等。对于Web UI层而言,尽管Spring提供了自己的MVC实现,但与Struts的流行程度相比,这个Spring MVC的使用并不广泛,毕竟在Web开发领域,Struts成名更早。在这个架构组合中,Spring起到的是一个应用平台的作用,通过Spring的集成,可以让应用在直接部署在Tomcat这个Web服务器上,因为作为一个直接依赖JVM的轻量级框架,Spring的部署方式就是一个简单的jar包,不需要以一个J2EE应用服务器的形式出现,从而使整个应用在Tomcat这样的Web服务器上可以直接运行起来,非常简洁。同样地,如果我们在测试环境中使用Spring,还可以选择使用Jetty来提供Web服务,使用HSQLDB这样的由纯Java实现的数据库。这样的环境,不但可以为调试应用带来许多便利,还可以进一步体现Spring轻量级开发的特点。

同样,因为Spring的实现中,它的核心实现,比如IoC容器实现,是直接依赖JVM虚拟机的,也就是说,在Java环境中,Spring IoC容器是可以单独使用的,特别是在BeanFactory的基本实现中,包含在一个小小的jar包里面,可以直接在应用中引用。对于Spring而言,如果要在.NET环境下使用其提供的基本特性,Spring项目也提供了Spring.NET的实现;如果需要在Android移动平台中使用Spring的基本特性,Spring也有对Spring Android项目的支持。从这些应用场景上可以看出,因为Spring设计时的轻量级特性,以及推崇POJO开发,所以使用起来非常灵活。在对Spring的应用中,Spring团队为我们列举了Spring的价值,非常值得参考。

❍Spring是一个非侵入性(non-invasive)框架,其目标是使应用程序代码对框架的依赖最小化,应用代码可以在没有Spring或者其他容器的情况下运行。

❍Spring提供了一个一致的编程模型,使应用直接使用POJO开发,从而可以与运行环境(如应用服务器)隔离开来。

❍Spring推动应用的设计风格向面向对象及面向接口编程转变,提高了代码的重用性和可测试性。

❍Spring改进了体系结构的选择,虽然作为应用平台,Spring可以帮助我们选择不同的技术实现,比如从Hiberante切换到其他ORM工具,从Struts切换到Spring MVC,尽管我们通常不会这样做,但是我们在技术方案上选择使用Spring作为应用平台,Spring至少为我们提供了这种可能性和选择,从而降低了平台锁定的风险。1.5 小结

本章简要回顾了Spring的设计理念、架构设计和应用场景。在Spring的整体架构中,我们对Spring的各个模块和模块关系进行了简要的介绍,在后面的章节中,我们还会对这些模块的实现细节和设计进行更为详细的阐述。在Spring的应用场景中,众所周知的SSH是我们常见的技术选择,但不见得Spring就只能在这个组合中出现,因为Spring自身也包括了MVC框架、数据持久化操作等,同时也因为Spring自身设计的模块化很好,所以,在使用Spring的时候,对Spring可以按不同角度进行裁剪,并且有不小的选择空间,而这些对应用场景的裁剪和选择,取决于我们对Spring的认识和应用开发的需要。在这里,我们只对Spring的典型应用场景进行简要介绍,关于Spring的内部设计和实现细节,是后面要阐述的主要内容,希望通过这些外部场景和内部设计的介绍,能够让读者对Spring的使用更加得心应手。第一部分 Spring核心实现篇

第2章 Spring Framework的核心:IoC容器的实现

第3章 Spring AOP的实现

本篇将对Spring的核心IoC容器和AOP的实现原理进行阐述。IoC容器和AOP是Spring的核心,它们是Spring系统中其他组件模块和应用开发的基础。通过这两个核心模块的设计和实现可以了解Spring倡导的对企业应用开发所应秉持的思路,比如使用POJO开发企业应用,提供一致的编程模型,强调对接口编程等。对于这些Spring背后的开发思想和设计理念,大家都不会陌生,在Rod Johnson的经典著作中都有全面而深刻的讲解。作为参考,我们可以查看Spring官方网站对Spring项目的描述。如下图所示,Spring的目标和愿景写得很清楚。

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载