1. 首页
  2. 编程语言
  3. Java
  4. Spring技术内幕:深入解析Spring架构与设计原理(第2版).pdf

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

上传者: 2019-09-09 00:18:12上传 PDF文件 40.23MB 热度 21次
为什么要写这本书本书探讨了 Spring框架的设计原理、架构和运行机制。作为在Java领域最为成功的开源软件之一, Spring在 Java EE开发中,使用者众多。本书以 Spring的源代码为依托,结合Spring的设计思路,从内部实现的角度,对 Spring的实现进行了翔实的分析,希望能够通过这种分析,使读者在开发者的层面掌握 Spring,为开发 Spring应用提供更扎实的框架基础。忽如一夜春风来”,伴随着2002年 Rod johnson的《 Expert One- on-One J2 EE Design andDevelopment》一书的出版而正式发布的 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与UNX和 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-OneJ2 EE Development without EJB》中所提到“ WithoutEJB设计思想”的具体体现,同时,也深刻地体现了 Spring背后的设计理念。其次,在IoC容器和AOP这两个核心模块的支持下, Spring为了简化 Java EE的开发,为应用开发提供了许多现成的用户态的系统组件,比如事务处理、 Web mvc、JDBC、OR映射、远端调用等,通过这些系统组件,为企业应用服务的实现提供驱动支持。这些由 Spring或其生态系统(其本身、子项目或者社区)提供的,类似于驱动模块般的系统组件是开发应用时经常会用到的 Java ee服务抽象。通过使用 Spring提供的这些类似于驱动组件的中间产品,通过这一层 Java Ee服务的抽象,从而让用户可以通过使用简单的开发接口或应用模板,不但能够很方便地使用各种 Java ee服务,还可以灵活地选取提供这些服务的各种不同的具体实现方案。让应用可以在各种第三方开源软件或者商业产品中自由选择,充分体现了 Spring作为应用平台的开放性。Spring作为一个开源项目,它本身就是一个开放的生态系统。对于和 Spring相关的一些项目,可以把它们看做在某个领域的用户应用,因为它们是和 Spring实现紧密相关的,或者它们本身就作为 Spring框架的应用案例,体现了许多使用 Spring的技巧。这些内容都是我们开发应用时的理想参考,并且会随着技术的发展而不断丰富,比如 Spring dM、 Spring FLEX、ACEG安全性框架,以及 Pet clinic应用实例等。一方面,可以把这些实现作为应用的一个基本方案加以裁剪,以满足特定领域的需求;另一方面,通过剖析这些应用,可以为应用开发提供很好的参考和借鉴,提高应用开发的效率从更深层次的技术层面上来看,因为 Spring是一个基于Java语言的应用平台,如果我们能够对 Spring的运行环境Java计算模型(比如IVM的实现原理)有一些了解,将会加滐我们对 Spring实现原理的理解。反射机制、代理类、字节码技术等这些JM特性,都是在 Spring实现中会涉及的一些Java计算环境的底层技术。一般的应用开发人员可能不会直接从事与JγM底层实现相关的工作,但是,这些计算环境的底层知识对深入理解 Spring是不可缺少的。说了这么多,很多读者可能已经有些迫不及待了,只有对 Spring的设计和实现身临其境地接触才是真实的,这里太多的文字已经成为一种累赞。本书将带领你到Spng核心设计这个茂密而又充满生机的源代码丛林中去一探究竟。在这里,你会惊奇地发现:这个过程就像是阅读优美的散文一样,是与开源软件开发者及开发者社区之间的一种畅快淋漓的交流,让人如痴如醉。第1版与第2版的区别本书是第2版,在写作过程中吸收了读者对上一版内容的许多意见和建议,比如着重增加了对$ pring宏观框架和设计方面的阐述,加强了对 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模块的分析,一方面可以了解Spng的发展历程,丰富视野:另一方面,也可以看到 Spring与时俱进的旺盛生命力。读者对象口学习Java语言和avaE技术的中高级读者Spring是利用Java语言实现的,其很多特性的设计和实现都极其优秀,非常具有硏究和参考价值。对这部分读者来说,不仅可以从本书中了解 Spring的实现原理,还能通过 Spring的设计原理和源代码实现,掌握大量的Java设计方法、设计模式、编码技巧和 Java ee开发技术。口 Spring应用开发人员如果要利用 Spring进行高级应用开发,抑或是相关的优化和扩展工作,仅仅掌握 Spring的配置和基本使用是远远不够的,必须要对 Spring框架的设计原理、架构和运作机制有一定的了解。对这部分读者而言,本书将带领他们全面了解 Spring的设计和实现,从而加深对Spring框架的理解,提高开发水平。同时,本书可以作为他们定制和扩展 Spring框架的参考资料。口开源软件爱好者Spring是开源软件中的佼佼者,它在实现的过程中吸收了很多开源领城的优秀思想,同时也有很多值得学习的创新。尤为值得一提的是,本书分析 Spring设计和实现的方式也许值得所有开源软件爱好者进行学习和借鉴。通过阅读本书,这部分读者不仅能领略到开源软件的优秀思想,还可以掌握分析开源软件源代码的方法和技巧,从而进一步提高使用开源软件的效率和质量。口平台开发人员和架构师Spring的设计思想和体系结构、详细设计和源码实现都是非常优秀的,是平台开发人员和架构师们不可多得的参考资料。如何阅读本书本书主要内容分为三个部分,分别阐述了 Spring的核心、组件和应用三个方面。在展开这三个部分的内容之前,第1章对 Spring的项目情况和整体架构进行了简要的介绍,这一章就像一个热身活动,为本书的主要内容做铺垫,如果您已经很熟悉 Spring的使用,这一章可以自行跳过,直接进入到下面三个主体部分的内容。第一部分详细分析了oC容器和AOP的实现,这部分内容是理解 Spring平台的基础,适合对 Spring的运行机理有深入了解需求的读者阅读。在对AOP实现模块的分析中涉及的一些JVM底层技术,也是读者需要具备的背景知识。第二部分深入阐述了基于 Spring IoC容器和AOP的 Java EE组件在 Spring中的实现。在这部分内容中可以看到,每一个组件实现的内容基本上都是相对独立的,读者可以结合自己的需求选读。如果对 Spring Web mvo的实现感兴趣,可以阅读第4章;如果对 Spring提供的数据库操作的实现机制感兴趣,可以阅读第5章;如果对 Spring中提供的统一事务处理的实现感兴趣,可以阅读第6章;如果对 Spring提供的各种不同的远端调用实现感兴趣,可以阅读第7章。第三部分讲述了一些基于 Spring的典型应用的实现。如果读者对在 Spring应用中如何满足应用资源的安全性需求方面的内容感兴趣,可以阅读第8章,本章对为 Spring应用提供安全服务的ACEG框架的实现进行了分析,在深入了解这部分内容的基础上,读者可以根据自己的应用需求定制自己的安全系统。第9章分析了 Spring DM的设计和实现,通过 Spring Dm,可以将 Spring应用便利地架构到OSG的框架上去。第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的设计理念和整体架构/11.1 Spring的各个子项目/212 Spring的设计目标/51.3 Spring的整体架构/714 Spring的应用场景/101.5小结/12第一部分 Spring核心实现篇第2章 Spring Framework的核心:IoC容器的实现/162.1 Spring Ioc容器概述/172.1.1IoC容器和依赖反转模式/172.1.2 Spring loc的应用场景/182.2IC容器系列的设计与实现: Bean Factory和 Application Context/19221 Spring的IC容器系列/192.2.2 Spring loc容器的设计/2123IC容器的初始化过程/28231 Bean Definition的 Resource定位!29232 Bean definition的载入和解析/37X233 Bean Definition在IoC容器中的注册/5224IoC容器的依赖注入/542.5容器其他相关恃性的设计与实现/752.51 Application Context和Bean的初始化及销毁/752.5,2lazy-init属性和预实例化/81253 Factory Bean的实现/822.54 BeanPostProcessor的实现/85255 autowiring(自动依赖装配)的实现/882.5.6Bean的依赖检查/902.5.7Bean对IoC容器的感知/9126小结/92第3章 Spring AoP的实现/9431 Spring AOP概述/953.1.1AOP概念回顾/953.1,2 Advice通知/983.13 Pointcut切点/1023.14 Advisor通知器/l0532 Spring AOP的设计与实现/10632,1JVM的动态代理特性/1063.2.2 Spring AOP的设计分析/108323 Spring AOP的应用场景/10833建立 AopProxy代理对象/1093.31设计原理/109332配置 Proxy Factory Bean/110333 ProxyFactory Bean生成 AopProxy代理对象/11l334JDK生成 AopProxy代理对象/1163.35 CGLIB生成 AopProxy代理对象/11734 Spring AOP拦截器调用的实现/1934.1设计原理/1193.4.2 JdkDynamicAopProxy的 invoke拦截/120343Cg1ib2 AopProxy的 Intercept拦截l121344目标对象方法的调用/122345AOP拦截器链的调用/12334.6配置通知器/124
下载地址
用户评论