Spring Live 第一章翻译

Spring 介绍
Spring 的基础及其历史
 
本章概括了Spring的基础、由来以及为何越来越多的人关注和评论它。并且比较了传统的解决依赖关系的方式(使用工厂模式绑定接口与实现)与Spring中用XML方式的异同。同时还涉及了Spring如何简化Hibernate API。
Spring的历史
Rod Johnson是Spring的最初的发起者。Spring项目出自他的Expert One-on-One J2EE Design and Development一书,在2002年的下半年,我非常推崇此书。在本书中,Rod描述了他在J2EE中的实践经验以及为何EJB对于项目来说经常是梦魇(overkill)。他认为一个轻量级的、以普通JavaBeans为基础的框架就能满足大多数开发者的需求。这个后来被著称为Spring的框架在2003年的二月出现在开源网站SourceForge上。此时,Juergen也加入了Rod进行Spring的开发。在接下来的几个月中,两人又吸收了其它多位开发者参与此项目。到此书写作为止,共有十六位开发者在Spring的开发行列中。Rod和Juergen最近合作写了另外一本如何利用Spring解决诸多J2EE开发的问题的书Expert One-on-One J2EE Development without EJB。
Spring的基础架构Rod在2000年之初就开始开发(要早于其它的我所知道的框架如Struts等)。这些基础是从Rod多个成功的商业项目中抽取的。Spring的基础架构被成百上千的开发者不断的加强和完善。每个人都将自己成功的经验加入其中,并且你也可以看到它在一天天的强大。它的组织正在茁壮成长,开发者们正热情高涨并致力使得Spring成为最好的J2EE开发框架。
关于Spring
Spring网站将Spring定义为:“Spring是一个多层的J2EE框架,它的基础是Rod Johnson在Expert One-on-One J2EE Design and Development一书中的示例代码。”它的核心提供了一个管理业务对象以及它们之间依赖关系的方法。例如,应用控制反转(IOC),它可以特定一个数据访问对象(DAO)去依赖于某一个数据源。同时,它允许开发者实现接口并在XML文件中去定义其实现类。Spring还提供了许多对其它框架(如Hibernate以及Struts)的支持使得其与其它框架的集成非常容易。
利用Spring,在某些情况下,设计模式你可以不必。因为Spring其实就是遵从了J2EE的设计模式,并且使得其十分简单。例如,你可以不必去写一个服务定位器(ServiceLocator)器查找Hibernate Sessions,只需要在Spring中配置一个SessionFactory即可。这样使得你可以轻松的遵从J2EE领域专家的最佳实践,而不是自己去勾画出最新的设计模式。
为什么人人都喜欢Spring
如果你经常去一些在线论坛比如TheServerSide.com或者JavaLobby.org,你可以Spring经常会被提及。在一些Java的博客社区(Blogging community)中Spring则更为流行。许多开发者都在描述他们利用Spring的经验以及赞赏它的易用性。
Spring不仅解决了开发者的问题,而且还迫使开发者使用一些好的编程实践,比如面向接口编程、减少耦合以及使得测试更加容易。在现代编程时代,特别是在Java编程中,优秀的开发者都在时间测试驱动开发(TDD)。测试驱动开发是一种利用测试或者你的客户类来驱动其它类的设计的开发模式。与传统开发不同,首先需要建立客户类,而不是写下服务类然后再去编写客户类来适应它。这种方式使得你知道你究竟要从你所开发的服务类获取什么。Spring中包含了大量的test suite使得测试自己所编写的类更加方便和容易。
将Spring与J2EE的最佳实践相比,blueprints建议我们在EJB中处理业务逻辑。但是EJB需要容器支撑才能运行,所以你必须在测试前启动容器。不断的重启象Weblogic、WebSphere以及JBoss这样的EJB服务器来测试所开发的类对开发者来说确实是一件考验耐性的事情。
常见的对Spring的批评
    面对成功,经常会有一些吹毛求疵的批评声。我所见到的对Spring最强的反对意见是说它不是一个“标准”,也就是说它不是J2EE规范的一部分以及它不是由JCP开发的。他们声称EJB才是标准。但是,标准的最主要的用途是保证其在应用服务器之间的可移植性。也就是说在一个服务器上开发的代码应该在另一个服务器上很顺畅的运行,但是将EJBs从一个EJB的容器移植到另外一个容器的时候并不像所预想的那样容易。不同的厂商需要不同的部署描述符并且没有一个通用的配置数据源或者其它对容器依赖的通用的方法。而利用Spring来编写的业务逻辑具有很强的移植性,因为从一个容器移植到另外一个容器我们不需要对代码以及部署描述符做任何的改动!
    Spring方便我们编程的同时,一些开发者抱怨它太庞大(too heavyweight)。然后,Spring是一个菜单式的(a la carte)框架,你可以像点菜一样选择你所要使用的内容。因为开发组已经将发布分割,你可以任意选择你要使用的JARs。
Spring 的原理
    J2EE Design and Development一书描述了Spring的基本原理。Spring是一种利用普通JavaBeans配置应用的方法。我所涉及的JavaBeans,是指拥有其内部变量的getters和setters的类。尤其是,如果一个类暴露了其setters方法,Spring就可以配置该类。利用Spring,你可以利用setters暴露任何类之间的依赖关系(如数据库连接),然后通过配置Spring去设置这些依赖关系。更妙的是,你甚至不必要去写一个类来专门建立数据库连接,这样的功能同样可以在Spring中通过配置实现!这种解决依赖关系的方案被称为控制反转(IOC)或者依赖注射(Dependency Injection)。从技术层面上讲,这是通过某种容器把有依赖关系的对象联系到了一起。
   Spring包括7个单独的模块,每个都有其单独的JAR文件。下图描述了它的7个模块:
 
在第二章所要开发的MyUsers应用系统中,我们将会用到其中的几个,并不是其全部的模块。而且我们所应用的模块中也只是其一小部分功能。
下图描述了我们将在MyUsers系统中所要应用的Spring模块:
Spring 如何使得J2EE应用更加简单
在图1.2中,不难看出Spring提供了我们要建立的应用系统中的很多部分。咋一看来,我们似乎需要对Spring了解很多。事实上不是这样的,多数情况下,在用之前开发者在应用Spring的时候甚至不知道其API。比如,在中间层需要设置声明性事务处理以及在业务代理上设置DAOs。代码中甚至看不到一句从Spring中导入类库的语句,也不用用工厂模式来决定需要应用哪个DAO的实现类。我们所要做的只是将这些放入XML配置文件中,看我们的设计多么清晰,得意吧。
下面的几节讲述Spring如何简化开发过程。
面向接口的编程
    面向接口的编程使开发者事先知道他们将利用对象的方法。在设计应用时利用接口对我们获取实现的灵活性大有帮助。同时,利用接口使得各层之间得交互耦合性更为松散。
测试更为容易
利用测试驱动开发是快速开发高质量代码的最佳途径。它利用在编写接口和实现之前先编写客户类(测试类)来驱动设计。事实上,诸如Eclipse和IDEA这样的主流IDE都允许在实现测试类的同时创建类和方法。Spring使得测试更加容易有如下两个原因:
l         可以在Junit测试用例中很容易的加载和利用Spring管理的beans。这使得我们可以像平常一样用任何客户端与这些beans交互。
l         类之间没有绑定自己的依赖。这样在测试类中可以忽略Spring,只是设置模拟对象(mock objects)来处理依赖关系即可。
减少耦合:工厂模式vs. Spring
为了创建一个容易维护和扩展的的应用,将代码与特定的资源(例如,可能使用了针对于某个特定数据库的SQL函数)紧密耦合是不明智的。当然,如果有合适的函数可以帮助你迅速的实现功能时,针对于某个特定数据库通常是比较容易的。这种情况下,J2EE设计模式通常建议使用工厂模式来减少实现类与应用之间的耦合。
通常情况下,为应用的每个业务层都创建接口是非常好的选择。这样会使得各层之间忽略与之关联层的具体实现。一个典型的J2EE应用包括3层:
l         数据层:与数据库或者其它存储系统交互的类。
l         业务逻辑层:专门处理业务逻辑的类,同时也是界面层和数据层之间的桥梁。
l         用户接口:向用户展现的由类以及显示文件组成的网页或者桌面应用。
图1.3是一个典型的J2EE应用的各层。
工厂模式(在Gof中称为抽象工厂和工厂方法)使得我们可以轻松的从一个实现类切换到另一个实现类。例如,可以创建一个抽象的DAOFactory类以及一个特定的工厂实现类(如DAOFactoryMySQL)。要获得更多的信息,请参考J2EE核心模式中数据访问对象模式。
配置和绑定类之间的依赖关系
工厂模式是一个复杂的J2EE模式。它不仅需要生成两个类,而且还要关注管理这些对象的依赖关系。例如,从一个工厂中得到一个DAO,如何才能传入一个数据库连接(除非在每一个方法中打开一次)?当然,我们可以在构造函数中创建它,但是如果你的DAO实现类需要使用Hibernate Session呢?这个仍可以通过在构造函数中加入一个java.lang.Object的参数然后造型到所需要的类来解决,但是这样的用法是很蹩脚的。
利用Spring绑定接口与实现是更好的方式。接口和实现都可以配置在XML文件中并且可以方便的通过改变文件来改变实现类。更妙的是,可以写单元测试类来隐藏具体的实现类-也就是说可以通过运行测试类来测试多个实现类。它可以很好的与iBATIS和Hibernate的DAO实现集成。由于测试类本质上是客户端,这是保证业务逻辑层与不同的DAO实现之间交互的很好的途径。下面是一个利用Spring获得UserDAO实现的例子:
    如果现在需要变更UserDAO的实现类,你所需要做的只是改变上述XML文本块中class属性。这是一个可以在应用中使用的非常清晰的模式。所需要做的只是在bean的定义文件中加入几行。另外,Spring通过sessionFactory属性管理DAO中的Hibernate Session。我们不需要担心在使用完的时候忘记将它关闭。
对象/关系映射工具
Spring的另外一个用途是它是一个支持对象/关系映射的工具。利用支持ORM的类的第一个优点就是我们不再需要写繁多的try/catch语句来捕获API抛出的异常。Spring将这些异常封装成为运行时的异常(runtime exceptions),这样使得开发者可以在适当的时候捕获发异常。下面是一个不使用Spring的UserDAOHibernate类中的getUsers()方法:
再来看一下使用Spring的Hibernate扩展(从类HibernateDaoSupport类继承),相比来说简短也简单的多:
从这些例子中,不难看出Spring是如何简化各应用层之间以及各类之间的依赖关系的解耦。它还简化了使用类似Hibernate的ORM工具的API。
总结
本章讨论了Spring的历史、为何Spring如此流行以及Spring如何简化J2EE的开发。还提供了使用传统工厂模式与使用Spring的ApplicationContext区别的例子,以及使用Spring开发Hibernate与不使用它开发的对比。
Spring的ApplicationContext可以被看作是一个用于实例化对象的bean提供者(bean provider),通过它可以绑定依赖关系并通过预先的配置提供给开发者。
第二章是一个利用Spring,Hibernate和Struts构建用户管理的web应用的教程。这个应用向我们展示了Spring是如何使得开发以及测试驱动开发更为简单。
第三章则介绍了Spring的核心模块以及它如何管理bean的声明周期。这是Spring的核心,它控制了这些对象如何一起工作并且提供了对象赖以生存的环境。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
[i]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值