`
DigitalSonic
  • 浏览: 215233 次
社区版块
存档分类
最新评论

Introduction to the Spring Framework 2005年5月版 完整翻译

阅读更多

Introduction to the Spring Framework<o:p></o:p>

By Rod Johnson<o:p></o:p>

<o:p> </o:p>

自从这篇文章的第一版在200310月发表以来,Spring框架正在逐步普及。经历了1.0最终版到现在的1.2版,而且被运用于很多行业和项目中。在这篇文章中,我会解释Spring为什么会获得成功,并告诉你我十分肯定它能帮助你开发J2EE应用程序。

又是一个框架?

你可能正在想不过是另一个的框架。如今有这么多J2EE框架,并且你可以建立你自己的框架,为什么你应该读这篇文章或者下载Spring框架(或者你还没有下载)?社区中持续的高关注度暗示了Spring一定有它的价值;这也有很多技术原因。

以下的几个原因让我相信Spring是独一无二的:

l         它关注于很多其它框架没有关注的地方。Spring着重于提供一种管理你业务对象的方法。

l         Spring是全面的、模块化的。Spring采用分层架构,这意味着你可以仅选择其中任何一个独立的部分,而它的架构是内部一致的。因此你能从学习中获得最大的价值。例如,你可以仅用Spring来简化你的JDBC使用,或者你可以选择使用Spring来管理你的业务对象。把Spring增量地引入现有的项目中是十分容易的。

l         Spring从设计之初就是要帮助你写出易于测试的代码。Spring是测试驱动项目的一个理想框架。

l         Spring是一个日益重要的集成技术,它的角色已得到一些大厂商的认可。

Spring不需要你的项目再依赖于另一个框架。Spring也许能称得上是一个一站式商店,提供了大多数传统应用所需要的基础结构。它还提供了别的框架没有涉及到的东西。

作为一个从20032月开始的开源项目,Spring有深厚的历史背景。这个开源项目源自我在2002年底出版的《Expert One-on-One J2EE Design and Development》中的基础代码。书中展现了Spring背后的基础性架构思考。然而,这个架构概念可以追溯到2000年早期,并反映了我在一系列成功的商业项目的基础结构的开发中所获得的经验。

20031月起,Spring落户于SourceForge。现在有20位开发者,一些主要人员把所有的时间都花在了Spring的开发和支持上。繁荣的开源社区帮助它茁壮成长,这远非任何个人所及。

Spring架构上的好处

    在继续深入前,让我们来看看Spring带给一个项目的好处:

l         Spring可以有效组织你的中间层对象,无论你是否选择使用EJBSpring关心那些当你只选择Struts或其他为J2EE API量身定做的框架时被留给你解决的问题。Spring的配置管理服务可以被运用于任何运行环境的各种架构性分层中,这也许是中间层中最有价值的。

l         Spring可以消除在很多项目中所常见的单例的过度使用。在我看来,它的主要问题是降低了可测试性和面向对象的程序。

l         Spring通过一种在应用程序和项目之间一致的方法来处理配置,这消除了需要自定义配置文件格式的烦恼。还记为了知道某个类要找哪个神奇的属性项或系统属性而不得不去读Javadoc,甚至读源代码吗?有了Spring你只要简单地看看类的JavaBean属性或构造参数。控制反转和依赖注入(将在下文讨论)的使用帮助实现了这一简化。

l         Spring通过把针对接口而非类编码的代价降低到几乎未零来帮助养成好的编码习惯。

l         Spring被设计为让构建在它之上的应用程序尽可能少地依赖于它的API。大多数Spring应用程序中的业务对象不依赖于Spring

l         构建于Spring之上的应用程序很容易进行单元测试。

l         Spring使得是否使用EJB成为实现时的选择,而非架构上的决定。你能在不改变调用代码的情况下选择用POJOEJB来实现业务接口。

l         Spring帮助你在不用EJB的情况下解决很多问题。Spring能提供一种适用于很多应用程序的EJB的替代品。例如,Spring可以无需EJB容器,用AOP来提供声明性事务管理;如果你仅与一个数据库打交道,甚至可以没有JTA实现。

l         Spring为数据访问提供了一个一致的框架,无论使用JDBC还是像TopLinkHibernate或者JDO实现这样的实体关系映射产品。

l         Spring为很多方面提供了一种一致的简单的编程模型,这使得它成为了一种理想的架构。你可以从Spring访问JDBCJMSJavaMailJNDI和很多其他重要API的途径中发现这种一致性。

Spring是一种帮助你使用POJO来构建应用程序的基础技术。要达到这个目标需要一个能将复杂性隐藏起来的成熟的框架。

因此Spring真的可以帮助你实现针对你的问题的最简单可行的解决方案。这是十分有价值的。

Spring做了些什么?

Spring提供许多功能,所以我将依次地快速浏览每个主要方面。

任务描述

首先,让我们明确一下Spring的范围。尽管Spring囊括了很多东西,但我们应该清楚的知道它该涉及什么,不该涉及什么。

Spring的主要目的是使J2EE更易于使用,培养好的编程习惯。它通过使用一种能适用于很多环境下的基于POJO的编程模型来实现这一目的。

Spring不重新发明轮子。因此你会发现Spring中没有日志,没有连接池,没有分布式事务调度。所有这些东西都由开源项目(例如提供我们所有的日志输出的Commons Logging,或者是Commons DBCP)或你的应用服务器提供。同样的道理,我们不提供实体/关系映射层。因为有像TopLinkHibernateJDO这样的优秀的解决方案。

Spring致力于使现有技术更加易用。例如,尽管我们没有底层业务的事务调度,但我们提供了一个凌驾于JTA或其他事物策略的抽象层。

Spring不直接与其他开源项目竞争,除非我们觉得我们能提供些新的东西。比如说,像其他开发者一样,我们从未就Struts感到满意,我们觉得MVC Web框架还有改进的余地。(随着Spring应用地快速推广,很多人也同意了我们的观点。)在很多领域,例如它的轻量级IoC容器和AOP框架,Spring有直接的竞争,但Spring确实是这些领域的先锋。

Spring得益于内部一致性。所有开发者正唱着同一首赞歌,基础思想依然忠于《Expert One-on-One J2EE Design and Development》中提出的思想。我们已经能够在多个领域中使用

些核心概念,例如控制反转。

Spring可用于各种应用服务期。当然保证可移植性一直是一个挑战,但我们避免了开发者眼中的各种平台特有的或非标准的东西,支持WebLogicTomcatResinJbossJettyGeronimoWebSphere和其他应用服务器。Spring的非侵入性、POJO方法是我们可以利用环境特有特性而不用放弃可移植性,就像Spring 1.2中在掩护下使用BEA特有API从而开启增强WebLogic事务管理功能。

控制反转(Inversion of Control, IoC)容器

Spring的核心是为与JavaBeans一起工作而设计的org.springframework.beans包。这个包一般不直接被用户调用,而是作为Spring功能的基础。<o:p></o:p>

下一个更高的抽象层是bean工厂。一个Springbean工厂是一个普通的工厂,它能通过名称获得对象,并管理对象的关系。<o:p></o:p>

Bean工厂支持两种模式的对象:<o:p></o:p>

l         单例:这种情况下,存在一个有特定名称,在查找时能被获取的共享对象实例。这是默认的,也是最常用的模式。是无状态服务对象的理想选择。<o:p></o:p>

l         原型或非单例:在这种情况下,每次获取操作都会创建一个独立的对象作为结果。例如,这能被用来使每个调用者都有自己的独立的对象引用。<o:p></o:p>

因为Spring容器管理对象间的关系,它能在以下情况添加值,在诸如受管理的POJO的透明池、支持热交换之类的服务需要的地方,为在运行时交换目标引用但不影响调用者和线程安全性而由容器引入的一个间接层中。依赖注入的众多优点之一(简单讨论一下)就是这所有的一切几乎是透明的,没有API介入。<o:p></o:p>

org.springframework.beans.factory.BeanFactory是一个简单的接口,它能通过多种途径被实现。BeanDefinitionReader接口将元数据格式从BeanFactory各自的实现中分离出来,所以Spring提供的普通BeanFactory实现能和不同类别的元数据一起使用。尽管很少有人发现有这个必要,你还是可以简单地实现你自己的BeanFactory或者BeanDefinitionReader。最常用的BeanFactory定义是:<o:p></o:p>

l         XmlBeanFactory:它可解析简单直观的定义类和命名对象属性的XML结构。我们提供了一个DTD帮助简化编写。<o:p></o:p>

l         DefaultListableBeanFactory:它提供了解析属性文件中的bean定义的能力,可通过编程创建BeanFactory<o:p></o:p>

每个bean定义能被当作一个POJO(用类名和JavaBean初始属性或构造方法参数来定义),或被当作一个FactoryBeanFactoryBean接口添加了一个间接层。一般,这用来创建用AOP或其他方法的代理对象:例如,添加声明性事物管理的代理。这在概念上和EJB的拦截机制相近,但实践起来更方便,更有效。<o:p></o:p>

BeanFactory能选择性地参与于一个层次结构中,继承先辈的定义。这使得像控制器servlet这样的个体资源能拥有自己的独立对象集的同时,在整个应用程序中能共享公共配置。<o:p></o:p>

如此使用JavaBeans的动机在《Expert One-on-One J2EE Design and Development》的第四章中已经描述过了,你同样也可以在theServerSide站点上以免费PDF的形式获得(/articles/article.tss?l=RodJohnsonInterview)<o:p></o:p>

通过bean工厂的概念,Spring成为了一个控制反转容器。(我不太喜欢容器这个词,因为它令人想起了

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics