快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
象 — 不管是不是由 Guice 创建的。您还可以将字段标记为 final。

字段注入 会影响可测试性,特别是将字段标记为 private 时。这破坏了使用 DI 的主要 目的。应该尽量少使用字段注入。

方法注入 在您不控制类的实例化时很有用。如果您有一个需要某些依赖项的超类,也可 以使用方法注入(构造函数注入会使这种情况变得很复杂)。

选择实现

现在,假设应用程序中有多个 Vehicle。一样英勇的 Weasel Girl 无法驾驭 FrogMobile !同时,您不想在 WeaselCopter 上硬编码依赖项。清单 11 显示了 Weasel Girl 请求一种 更快的传输模式:

清单 11. 使用注释请求某种特定的实现

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

在清单 12 中,HeroModule 使用绑定函数告诉 Guice WeaselCopter 是 “很快” 的:

清单 12. 告诉 Guice Module 中的相关注释

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

注意,我选择了一个注释,描述我想以抽象形式描述的工具种类(@Fast),而不是与实 现太接近的注释(@WeaselCopter)。如果您使用的注释将想要的实现描述得太精确,就让读 者觉得创建一个隐式依赖项。如果使用 @WeaselCopter,而且 Weasel Girl 借用了 Wombat Rocket,就会对程序员阅读和调试代码造成混淆。

要创建 @Fast 注释,需要复制清单 13 中的模板:

清单 13. 复制粘贴这段代码以创建一个绑定注释

@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER}) @BindingAnnotation public @interface Fast {}

如果您编写了大量 BindingAnnotations,就会得到许多这样的小文件,每个文件只是注 释名称不同。如果您觉得这很繁琐,或者需要执行快速的原型设计,可以考虑 Guice 的内置 @Named 注释,它接受一个字符串属性。清单 14 展示了这种替代方法:

清单 14. 使用 @Named 代替自定义注释

// in WeaselGirl @Inject public WeaselGirl(@Named("Fast") Vehicle vehicle) {   //... } // in HeroModule binder.bind(Vehicle.class)   .annotatedWith(Names.named("Fast")).to(WeaselCopter.class);

这种方法是可行的,但由于名称只在字符串内有效,所以这不能利用编译时检查和自动补 齐。总的来说,我更愿意自己编写注释。

如果您根本不想使用注释,怎么办?即使添加 @Fast 或 @Named("Fast") 都会使类在某 种程度上影响配置本身。如果想知道如何解决这个问题,请接着阅读。

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

时间:2011-04-09 IBM Nicholas Lesiecki

provider 方法

如果每次探险都派遣 Frog Man,您可能会厌烦。您喜欢在每个场景中出现的 hero 是随 机的。但是,Guice 的默认绑定程序 API 不允许出现 “每次调用时将 Hero 类绑定到一个 不同的实现” 这样的调用。不过,您可以 告诉 Guice 使用一种特殊的方法来创建每个新的 Hero。清单 15 显示了将一个新方法添加到 HeroModule 中,并用特殊的 @Provides 注释进 行注释:

清单 15. 使用 provider 编写自定义创建逻辑

@Provides private Hero provideHero(FrogMan frogMan, WeaselGirl weaselGirl) {   if (Math.random() > .5) {    return frogMan;   }   return weaselGirl; }

Guice 会自动发现具有 @Provides 注释的 Module 中的所有方法。根据 Hero 的返回类 型,在您请求某个 hero 时,Guice 会进行计算,它应该调用 provider 方法

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