快速业务通道

用Guice写Java - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
码,你可以得到该模式大约80%的好处。

当上例中的客户代码向工厂对象请求一个服务时,根据依赖注入模式,客户代码希望 它所依赖的对象实例可以被传入自己。也就是说:不要调用我,我会调用你。

public class Client {   private final Service service;   public Client(Service service) {    this.service = service;   }   public void go() {    service.go();   } }

这让我们的单元测试简化了不少。我们可以只传入一个伪服务对象,在结束后也不需 要多做什么。

public void testClient() {   MockService mock = new MockService();   Client client = new Client(mock);   client.go();   assertTrue(mock.isGone()); }

我们也可以精确地区分出客户代码依赖的API。

现在,我们如何连接客户和服务对象呢?手工实现依赖注入的时候,我们可以将所有 依赖逻辑都移动到工厂类中。也就是说,我们还需要有一个工厂类来创建客户对象。

public static class ClientFactory {   private ClientFactory() {}   public static Client getInstance() {    Service service = ServiceFactory.getInstance();    return new Client(service);   } }

手工实现依赖注入需要的代码行数和简单工厂模式差不多。

用Guice写Java(3)

时间:2011-04-02 王咏刚

用 Guice 实现依赖注入

手工为每一个服务与客户实现工厂类和依赖注入逻辑是一件很麻烦的事情。其他一些 依赖注入框架甚至需要你显式将服务映射到每一个需要注入的地方。

Guice 希望在不牺牲可维护性的情况下去除所有这些程式化的代码。

使用 Guice,你只需要实现模块类。Guice 将一个绑定器传入你的模块,你的模块使 用绑定器来连接接口和实现。以下模块代码告诉 Guice 将 Service映射到单件模式的 ServiceImpl:

public class MyModule implements Module {   public void configure(Binder binder) {    binder.bind(Service.class)     .to(ServiceImpl.class)     .in(Scopes.SINGLETON);   } }

模块类告诉 Guice 我们想注入什么东西。那么,我们该如何告诉 Guice 我们想把它 注入到哪里呢?使用 Guice,你可以使用 @Inject 标注你的构造器,方法或字段:

public class Client {   private final Service service;   @Inject   public Client(Service service) {    this.service = service;   }   public void go() {    service.go();   } }

@Inject 标注可以清楚地告诉其他程序员你的类中哪些成员是被注入的。

为了让 Guice向 Client 中注入,我们必须直接让 Guice 帮我们创建Client 的实例 ,或者,其他类必须包含被注入的Client 实例。

Guice vs. 手工依赖注入

如你所见,Guice 省去了写工厂类的麻烦。你不需要编写代码将客户连接到它们所依 赖的对象。如果你忘了提供一个依赖关系,Guice 在启动时就会失败。Guice 也会自动处 理循环依赖关系。

Guice 允许你通过声明指定对象的作用域。例如,你需要编写相同的代码将对象反复 存入 HttpSession。

实际情况通常是,只有到了运行时,你才能知道具体要使用哪一个实现类。因此你需 要元工厂类或服务定位器来增强你的工厂模式。Guice 用最少的代价解决了这些问题。

手工实现依赖注入时,你很容易退回到使用直接依赖的旧习惯,特别是当你对依赖注 入的概念还不那么熟悉的时候。使用 Guice 可以避免这种问题,可以让你更容易地把事 情做对。Guice 使你保持正确的方向。

更多的标注

只要有可能,Guice 就允许你使用标注来替代显式地绑定对象,以减少更多的程式化 代码。回到我们的例子,如果你需要一个接口来简化单元测试,而你又不介意编译时的依 赖,你可以直接从你的接口指向

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号