用Guice写Java - JAVA - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > OOP语言 > JAVA > 正文

用Guice写Java

来源: www.bianceng.cn 阅读:

简介

Java企业应用开发社区在连接对象方面花了很大功夫。你的Web应用如何访问中间层服 务?你的服务如何连接到登录用户和事务管理器?关于这个问题你会发现很多通用的和特 定的解决方案。有一些方案依赖于模式,另一些则使用框架。所有这些方案都会不同程度 地引入一些难于测试或者程式化代码重复的问题。你马上就会看到,Guice 在这方面是全 世界做得最好的:非常容易进行单元测试,最大程度的灵活性和可维护性,以及最少的代 码重复。

我们使用一个假想的、简单的例子来展示 Guice 优于其他一些你可能已经熟悉的经典 方法的地方。下面的例子过于简单,尽管它展示了许多显而易见的优点,但其实它还远没 有发挥出 Guice 的全部潜能。我们希望,随着你的应用开发的深入,Guice 的优越性也 会更多地展现出来。

在这个例子中,一个客户对象依赖于一个服务接口。该服务接口可以提供任何服务, 我们把它称为Service。

public interface Service {

  void go();
}

对于这个服务接口,我们有一个缺省的实现,但客户对象不应该直接依赖于这个缺省 实现。如果我们将来打算使用一个不同的服务实现,我们不希望回过头来修改所有的客户 代码。

public class ServiceImpl implements Service {

  public void go() {

   ...

  }

}

我们还有一个可用于单元测试的伪服务对象。

public class MockService implements Service {

  private boolean gone = false;
  public void go() {
   gone = true;
  }
  public boolean isGone() {
   return gone;
  }
}

简单工厂模式

在发现依赖注入之前,最常用的是工厂模式。除了服务接口之外,你还有一个既可以 向客户提供服务对象,也可以向测试程序传递伪服务对象的工厂类。在这里我们会将服务 实现为一个单件对象,以便让示例尽量简化。

public class ServiceFactory {
  private ServiceFactory() {}

  private static Service instance = new ServiceImpl();
  public static Service getInstance() {
   return instance;
  }

  public static void setInstance(Service service) {
   instance = service;
  }
}

客户程序每次需要服务对象时就直接从工厂获取。

public class Client {
  public void go() {
   Service service = ServiceFactory.getInstance();
   service.go();
  }
}

Tags:
相关文章列表: