服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

它是最适合的 我热爱spring的五个理由

  15年前6月的一个闷热的早晨,我爬到一艘老式的玻璃纤维皮划艇中。它是如此古老,以至于有些小碎片差点插到了我的手指中,而且划桨长度大约是传统激流划桨的两倍。我游泳的时候要多过划船,但是这没有关系。15年之后,我仍然对它着迷。

  大约2年前,我试用了在hibernate站点上突出提到的spring项目。我觉得它就像是上面提到的老式皮划艇:它再适合我不过了。为了进行企业硬编码,spring如此深植于我的编程工作中,以至于我使用它作为我第4本java著作《spring: a developer's notebook》的主题。在本文中,我将说明其中的原因。

  1. spring 提供更好的优势

  在河流中,我学会了更多地使用我的腰和背来划桨,因为我的手臂肌肉无法坚持整日在河上划桨。我变得更加高效;我获得了更好的利用率。借助于spring,我可以使每行代码做更多的事情。借助于spring,您可以发现很多额外的手段,其中最大的一处是在持久性方面。下面给出一个hibernate数据访问对象中的方法:

public list getreservations( ) {  return gethibernatetemplate( ).find("from reservation");}}

  注意您没有看到的内容。这里没有事务处理。spring允许构建配置代码来处理事务。不必通过关闭会话来管理资源。不必进行自己的配置。不必在这个层次上管理异常,因为异常是未经检查的。可以自由地在最合适的位置管理它们。下面给出了另一个hibernate方法,没有使用spring:

public list getbikesoldway( ) throws exception {  list bikes = null;  session s = null;  try {    s = mysessionfactory.opensession( );    bikes = s.find("from bike");  }catch (exception ex) {    //handle exception gracefully  }finally {    s.close( );  }  return bikes;

  spring为您提供了更好的优势。借助于spring,可以更快地编写代码,而进行更少的维护。

  2. spring支持pojo编程

  ejb 2.x失败之后,我们都在寻求表达企业服务而不使用笨拙的模型侵入每个bean的方法。当然,我们需要事务、安全性、持久性,有时还需要远程控制。对于ejb,我必须学习一个广泛使用的api,并通过新的工具和部署流程开展工作。我是容器所提供的服务的奴隶。而借助于spring,我可以选择自己的服务和持久性框架。我进行pojo编程,并使用配置文件为它们添加企业服务。

  在《spring: a developer's notebook》一书中,我构建了一个rentabike应用程序。我把我的pojo称作hibrentabike,而不是会话bean或实体bean;它用作我的数据访问对象。我还在别处添加了服务。spring配置文件称为context,它是一个xml文件,包含容器中所有的bean以及bean所需的属性和服务。下面让我们看一看。

  目标:

<bean id="rentabiketarget" class="com.springbook.hibrentabike">  <property name="storename">    <value>bruce's bikes</value>  </property>  <property name="sessionfactory">    <ref local="sessionfactory"/>  </property>  <property name="transactionmanager">    <ref local="transactionmanager"/>  </property></bean>  拦截器:
<bean name="transactioninterceptor"     class="org.springframework.transaction.interceptor.
transactioninterceptor"> <property name="transactionmanager"> <ref local="transactionmanager"/> </property> <property name="transactionattributesource"> <value> com.springbook.rentabike.transferreservation= propagation_required,-reservationtransferexception com.springbook.rentabike.save*=propagation_required com.springbook.rentabike.*=propagation_required,readonly </value> </property></bean>

  代理:

<bean id="rentabike" class="org.springframework.aop.
framework.proxyfactorybean"> <property name="proxyinterfaces"> <value>com.springbook.rentabike</value> </property> <property name="interceptornames"> <value>transactioninterceptor,rentabiketarget</value> </property></bean>

  注意,有3种不同的bean:代理、目标和拦截器。代理将调用pojo以及pojo所需的任何服务。拦截器包含用于调用服务的结合代码(glue code),还指定了如何处理目标中的每个方法。任何需要访问rentabike的人都要调用代理,而代理调用事务拦截器,然后事务拦截器就会开始一个事务并调用目标(pojo)。目标完成自己的工作,返回给(负责提交事务的)拦截器,然后再返回给代理和代理的调用者。

它是最适合的 我热爱spring的五个理由(图一)
图1. 正在进行的pojo编程

  您在pojo之外构建程序并对其进行配置,而余下的工作就交给spring。我是一名pojo程序员。

  3.依赖注入有助于可测试性

  通过一种称为依赖注入(dependency injection,di)的设计模式,spring极大地提高了可测试性。当客户依赖于某种依赖性(我们将称之为一个服务)时,您将创建客户的一个属性。spring将创建客户和服务,然后把客户的属性设置为服务的值。换言之,spring负责管理上下文中bean的生命周期,并解决依赖性。下面给出一个依赖注入的例子,没有使用spring。我们首先来看客户(应用程序的基本元素):

public class commandlineview {  private rentabike rentabike;  public commandlineview( ) {rentabike = 
new arraylistrentabike("bruce's bikes"); }public void setrentabike(rentabike rentabike){ this.rentabike = rentabike;} public void printallbikes( ) { system.out.println(rentabike.tostring( )); iterator iter = rentabike.getbikes().iterator( ); while(iter.hasnext( )) { bike bike = (bike)iter.next( ); system.out.println(bike.tostring( )); } } public static final void main(string[] args) { commandlineview clv = new commandlineview( ); clv.printallbikes( ); }}

  接下来是服务,即模型。它是一种带有数组表的简单实现。它对模型(rentabike)具有依赖性。

interface rentabike {list getbikes( );bike getbike(string serialno);}public class arraylistrentabike implements rentabike {   private string storename;   final list bikes = new arraylist();   public arraylistrentabike(string storename) {      this.storename = storename;      bikes.add(new bike("shimano", "
roadmaster", 20, "11111", 15, "fair")); bikes.add(new bike("cannondale",
"f2000 xtr", 18, "22222",12,"excellent")); bikes.add(new bike("trek","6000", 19, "33333",
12.4, "fair")); } public string tostring() { return "rentabike: " + storename; } public list getbikes() { return bikes; } public bike getbike(string serialno) { iterator iter = bikes.iterator(); while(iter.hasnext()) { bike bike = (bike)iter.next(); if(serialno.equals(bike.getserialno())) return bike; } return null; }}  下面是一个汇编程序。以粗体表示的代码就是依赖注入。汇编程序实例化了服务和客户,然后通过设置rentabike属性来解决依赖性。
public class rentabikeassembler {  public static final void main(string[] args) {    commandlineview clv = new commandlineview( );    rentabike rentabike = new arraylistrentabike
("bruce's bikes"); clv.setrentabike(rentabike); clv.printallbikes( ); }}

  当然,spring最终将担任汇编程序的角色。如果把服务包装在一个接口中,就能够把任何接口实现注入容器中。

  依赖注入使您可以编码生产依赖性和测试依赖性。例如,本例创建了一个存根对象,从而可以更轻松地测试视图。

  您已经看到了rentabike的hibernate实现和数组表版本。我不想在完整的hibernate实现上运行所有的用户接口测试。相反,我使用数组表简单地实现了接口。

  依赖注入使您可以获得一个生产版本(使用hibrentabike)、一个开发版本(使用一个arraylistrentabike列表)和一个测试版本(使用一个mock对象)。使用java编程时,我使用依赖注入把这些mock放到难于到达的地方中。

4. 反向控制简化了jdbc

  jdbc应用程序麻烦、冗长且乏味。一个好的抽象层会有很大帮助。spring允许您使用查询定制一个默认的jdbc方法和匿名内部类,以便减少大量的繁重工作。下面给出了一个简单的jdbc例子:

jdbctemplate template = new jdbctemplate(datasource); final list names = new linkedlist();template.query("select user.name from user",   new rowcallbackhandler() {       public void processrow(resultset rs) 
throws sqlexception { names.add(rs.getstring(1)); } });

  把template.query方法当作一个默认的jdbc方法。spring将为结果集中的每一行执行匿名内部类中的processrow方法。您在上下文中配置数据源。您不必担心打开或关闭语句或连接、配置数据源或管理事务等诸项事宜。您不用指定外部的结果集或者在最底层管理异常,因为spring把sqlexception放到了一个未检查异常的常见集合中。其他语言,比如ruby和smalltalk,通常使用包含代码块的反向控制,但是这在java中并不十分常见。反向控制可以实现惊人的效果。

  5. spring在社区中的繁荣

  一些开源项目不需要特别有用。例如,junit完成了预定的任务,如果您喜欢编程模型,它基本上拥有您所需要的一切功能。像spring这样的轻量级容器需要一个有活力的社区。spring拥有您所能找到的最积极的社区之一,这对您有很多好处:

  • 服务:借助于spring,您可以找到数以百计的不同服务,从安全性到系统管理,再到工作流。对于持久性,您可以插入jdo、hibernate、top link、jdbc或ojb。
  • 支持与培训:许多独立顾问都提供spring服务,您可以在全球范围内获得优质的培训。
  • 增强:spring一年推出好几个版本。每个版本的质量都很不错,框架中的测试性良好,扩展组成清晰。spring已经开始支持hibernate 3,并会提供一个功能强大的新web流框架,这些都包括在最新的版本中。
  • 商业支持:有很多人像我一样编写有关spring的书籍。迄今为止,可以找到5本专门讲述spring的书籍,还有一些书籍包含了spring方面的内容。有几家产品供应商也支持spring。很多开源框架,比如geronimo和hibernate,对spring提供特殊的支持。

  spring社区使得使用这个框架变得更加容易。我可以雇佣spring开发人员,对他们进行培训。我可以阅读书籍来补充我的知识,并针对需要做的工作获取组件。我找不到另一个拥有其他类似的轻 量级容器的社区。

扫描关注微信公众号