zoukankan      html  css  js  c++  java
  • 五个理由来热爱Spring

    五个理由来热爱Spring

      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)。目标完成自己的工作,返回给(负责提交事务的)拦截器,然后再返回给代理和代理的调用者。


    图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开发人员,对他们进行培训。我可以阅读书籍来补充我的知识,并针对需要做的工作获取组件。我找不到另一个拥有其他类似的轻 量级容器的社区。

     
  • 相关阅读:
    十大开源Web应用安全测试工具
    HC大会,华为联合合作伙伴发布一站式物联网IoT开发工具小熊派BearPi
    漫谈边缘计算(四):赢家是软还是硬
    漫谈边缘计算(三):5G的好拍档
    漫谈边缘计算(二):各怀心事的玩家
    漫谈边缘计算(一):边缘计算是大势所趋
    从小小后视镜看物联网的生态(下)
    机器学习笔记(四)---- 逻辑回归的多分类
    机器学习笔记(三)---- 逻辑回归(二分类)
    机器学习笔记(二)---- 线性回归
  • 原文地址:https://www.cnblogs.com/encounter/p/2189229.html
Copyright © 2011-2022 走看看