科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件我热爱Spring的五个理由(2)

我热爱Spring的五个理由(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

大约2年前,作者试用了在Hibernate站点上突出提到的Spring项目,觉得它是再适合不过的。因为它提供更好的优势、支持POJO编程、依赖注入有助于可测试性、反向控制简化了JDBC和在社区中的繁荣。

作者:Bruce A. Tate 来源:BEA 2007年9月3日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章