快速业务通道

通过Guice进行依赖项注入 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
n "Mock Vehicle Zoomed.";   } } public void testFrogManFightsCrime() {   MockVehicle mockVehicle = new MockVehicle();   FrogMan hero = new FrogMan(mockVehicle);   hero.fightCrime();   assertTrue(mockVehicle.didZoom);   // other assertions }

这个测试使用了一个手动编写的 mock 对象来替换 FrogMobile。DI 不仅在测试中省去了 麻烦的 refinery 启动过程,而且使测试不用了解 FrogMobile 具体细节。需要的仅是一个 Vehicle 接口。除了使测试变得更简单之外,DI 还有助于提高代码的总体模块性和可维护性 。现在,如果想将 FrogMobile 切换为 FrogBarge,可以不修改 FrogMan。所有 FrogMan 都 依赖于 Vehicle 接口。

不过这里有一个陷阱。如果您是第一次阅读 DI,可能会想:“这下好了,现在所有 FrogMan 的调用方 都必须知道 FrogMobile(refinery、refinery 的依赖项,依此类推…… )”。但如果是这样,DI 就永远不会这么流行。您可以不增加调用方的负担,而是编写一些 工厂 来管理对象及其依赖项的创建。

工厂是存放框架的地方。工厂需要大量冗长重复的代码。工厂往往会让程序员(和读者) 很痛苦,他们甚至会嫌它麻烦而放弃编写。Guice 和其他 DI 框架可作为 “超级工厂”,您 可以通过配置它们来构建对象。配置 DI 框架比自己编写工厂容易得多。因此,程序员编写 的代码大部分是 DI 样式的。测试越多代码就越好,程序员以后也就越省事。

通过 Guice 进行基本注入

我希望在我的介绍之后,您会相信 DI 能为您的设计增加价值,而且使用框架会使工作更 轻松。现在让我们从 @Inject 注释和模块开始深入讨论 Guice。

告诉 Guice 给类添加 @Inject

FrogMan 与 Guice 上的 FrogMan 之间的唯一区别是 @Inject。清单 5 显示了 FrogMan 带有注释的构造函数:

清单 5. FrogMan 已经加上 @Inject

@Inject public FrogMan(Vehicle vehicle) {   this.vehicle = vehicle; }

一些工程师不喜欢给类添加 @Inject。他们更喜欢一个完全忽略 DI 框架的类。这种说法 有一定道理,但是我不大赞同。依赖项的注入会使注释的作用更加明显。@Inject 标记只在 您要求 Guice 构建类时才有意义。如果不要求 Guice 构建 FrogMan,这个注释对代码行为 就没有任何影响。这个注释恰当地指出了 Guice 将参与构建类。但是,使用它需要源代码级 别的访问。如果这个注释带来不便,或者正在使用 Guice 创建无法控制其源代码的对象,那 么 Guice 就会用一个替代机制(请参阅本文后面的 provider 方法的其他用法 侧边栏)。

告诉 Guice 您需要哪个依赖项

Guice 知道您的 hero 需要一个 Vehicle 后,它需要知道提供什么 Vehicle。清单 6 包 含一个 Module:一个特殊的类,用于告诉 Guice 各个接口对应的实现。

清单 6. HeroModule 将 Vehicle 绑定到 FrogMobile

public class HeroModule implements Module {   public void configure(Binder binder) {    binder.bind(Vehicle.class).to(FrogMobile.class);   } }

模块就是一个具有某种单实例对象方法的接口。Guice 传递给模块的 Binder 用于告诉 Guice 您想如何构造对象。绑定程序 API 形成一种 区域特定语言(请参阅 参考资料)。这 种小语言允许您编写表达式代码,比如 bind(X).to(Y).in(Z)。后面将提供更多有关绑定程 序作用的例子。每次调用 bind 都会创建一个绑定,Guice 将使用绑定集解析注入请求。

通过Guice进行依赖项注入(3)

时间:2011-04-09 IBM Nicholas Lesiecki

使用 Injector 启动

然后,使用 Injector 类启动 Guice。通常需要尽早在程序中创建注入器。这样 Guice 能够帮助您创建大部分对象。清单 7 包含一个以

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