快速业务通道

用Guice写Java - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

用Guice写Java

时间:2011-04-02 王咏刚

简介

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();   } }

用Guice写Java(2)

时间:2011-04-02 王咏刚

客户程序足够简单。但客户程序的单元测试代码必须将一个伪服务对象传入工厂,同 时要记得在测试后清理。在我们这个简单的例子里,这不算什么难事儿。但当你增加了越 来越多的客户和服务代码后,所有这些伪代码和清理代码会让单元测试的开发一团糟。此 外,如果你忘记在测试后清理,其他测试可能会得到与预期不符的结果。更糟的是,测试 的成功与失败可能取决于他们被执行的顺序。

public void testClient() {   Service previous = ServiceFactory.getInstance();   try {    final MockService mock = new MockService();    ServiceFactory.setInstance(mock);    Client client = new Client();    client.go();    assertTrue(mock.isGone());   }   finally {    ServiceFactory.setInstance(previous);   } }

最后,注意服务工厂的API把我们限制在了单件这一种应用模式上。即便 getInstance() 可以返回多个实例, setInstance() 也会束缚我们的手脚。转换到非单 件模式也意味着转换到了一套更复杂的API。

手工依赖注入

依赖注入模式的目标之一是使单元测试更简单。我们不需要特殊的框架就可以实践依 赖注入模式。依靠手工编写代

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号