《Spring技术内幕》——1.2节Spring的设计目标-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

《Spring技术内幕》——1.2节Spring的设计目标

简介: 本节书摘来自华章社区《Spring技术内幕》一书中的第1章,第1.2节Spring的设计目标,作者:计文柯,更多章节内容可以访问云栖社区“华章社区”公众号查看

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应用很好的参考。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接