Chinaunix首页 | 论坛 | 博客
  • 博客访问: 56009
  • 博文数量: 45
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-21 09:51
文章分类
文章存档

2011年(1)

2008年(44)

我的朋友
最近访客

分类: 系统运维

2008-04-13 21:32:03

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

  大约2年前,试用了在Hibernate站点上突出提到的Spring项目。觉得它就像是上面提到的老式皮划艇:它再适合我不过了。为了进行企业硬编码,Spring如此深植于我的编程工作中,以至于使用它作为第4本著作《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; 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失败之后,我们都在寻求表达企业服务而不使用笨拙的模型侵入每个的方法。当然,需要事务、安全性、持久性,有时还需要远程控制。对于EJB,必须学习一个广泛使用的API,并通过新的工具和部署流程开展工作。 是容器所提供的服务的奴隶。而借助于Spring,可以选择自己的服务和持久性框架。进行POJO编程,并使用配置文件为它们添加企业服务。

  在《Spring: A Developer"s Notebook》一书中,构建了一个RentaBike应用程序。POJO称作hibRentaBike,而不是会话bean或实体bean;它用作数据访问对象。在别处添加了服务。Spring配置文件称为context,它是一个XML文件,包含容器中所有的bean以及bean所需的属性和服务。下面让我们看一看。

  目标:Bruce"s Bikes

  拦截器:

  .springbook.RentABike.transferReservation=PROPAGATION_REQUIRED,-ReservationTransferExceptioncom.springbook.RentABike.save*=PROPAGATION_REQUIREDcom.springbook.RentABike.*=PROPAGATION_REQUIRED,readOnly

  代理:

  com.springbook.RentABiketransactionInterceptor,rentaBikeTarget

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

  

  图1:正在进行的POJO编程

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

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

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

  public 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.( );System.out.println(bike.toString( ));}}public static final void main([] args) {CommandLineView clv = new CommandLineView( );clv.printAllBikes( );}}

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

   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最终将担任汇编程序的角色。如果把服务包装在一个接口中,就能够把任何接口实现注入容器中

阅读(372) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~