前言

作为Java领域中最为成功的开源软件之一,Spring在Java开发中,有不可替代的作用和地位。本书以Spring的源代码为依托,从内部实现的角度,对Spring的设计原理、架构和运行机制进行了翔实的分析。

忽如一夜春风来,伴随着Rod Johnson的 Expert One-on-One J2EE Design and Development(2002年)一书的出版而正式发布的Spring框架(也就是当年的interface21),经过这几年的发展,已经逐渐成熟起来。吹面不寒杨柳风,Spring带来的崭新开发理念,也早已伴随着它的广泛应用而飞入寻常百姓家。

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

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

在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、DBC、O/R映射、远端调用等,通过这些系统组件为企业应用服务的实现提供驱动支持。这些由Spring或者其生态系统(其本身、子项目或者社区)提供的、类似于驱动模块般的系统组件是开发应用时经常会用到的Java EE服务抽象。Spring让用户可以用POJO来开发具体的应用,而这些应用往往需要Java EE服务的有力支撑。通过使用Spring提供的这些类似于驱动组件的中间产品,通过这一层Java EE服务的抽象,用户可以通过使用简单的开发接口或者应用模板很方便地使用各种Java EE服务和灵活地选取提供这些服务的各种不同的具体实现方案。比如,可以在各种第三方开源软件或者商业产品中自由地选择。

Spring作为一个开源项目,它本身就是一个开放的生态系统。对于与Spring相关的一些项目,可以把它们看作某个领域的用户应用,因为它们与Spring的实现紧密相关;或者,它们本身就作为Spring框架的应用案例,体现了许多使用Spring的技巧。这些都是我们开发应用的理想参考,比如ACEGI安全性框架和petclinic应用案例。一方面,可以把这些实现作为应用的一个基本方案加以裁剪,以满足特定领域的需求;另一方面,通过剖析这些应用,可以为应用开发提供很好的参考,提高开发效率。

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

在本书的写作过程中,VMware公司收购了Spring的运营者Spring Source。此次商业收购一方面反映了开源软件中蕴含着的巨大商业价值,另一方面反映了Spring的发展趋势:与云计算融合,以及Spring为自己规划的云计算战略—成为PaaS(Platform As a Service)服务的有力竞争者。在云计算这个全新的计算环境中,如何在发挥Spring在企业级应用开发中已经具备的优势的基础上,为云计算应用的开发提供高可靠性、高可用性、高可扩展性和高性能的应用平台,是Spring团队面临的全新挑战。Spring在这个崭新领域的雄心和作为让我们充满好奇和期待,我们拭目以待!

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

本书面向的读者

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

Spring是使用Java语言实现的,很多功能的源码实现都极其优秀,非常具有研究和参考价值。对这部分读者来说,不仅可以从本书中了解到Spring的实现原理,而且还能通过Spring的源代码,掌握一流的Java编码技巧和Java EE开发技术。

❑ Spring应用开发人员

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

❑ 开源软件爱好者

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

❑ 平台开发人员和架构师

前面已经反复强调,Spring的设计思想、架构和实现都非常优秀,是平台开发人员和架构师们不可多得的参考资料。