快速业务通道

用Guice写Java - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
试图拉扯一根没有尽头的线。这是好事情。它表明依赖注入正在帮助你改进代码的灵 活性和可测试性。

如果重构工作太复杂,你不想一次性地整理完所有代码,你可以暂时将一个 Injector 的引用存入某个类的一个静态的字段,或是使用静态注入。这时,请清楚地命名包含该字 段的类:比如 InjectorHack和 GodKillsAKittenEveryTimeYouUseMe。记住你将来可能不 得不为这些类提供伪测试类,你的单元测试则不得不手工安装一个注入器。记住,你将来 需要清理这些代码。

绑定依赖关系

Guice 是如何知道要注入什么东西的呢?对启动器来说,一个包含了类型和可选的标 注的 Key 唯一地指明了一个依赖关系。Guice 将 key和实现之间的映射标记为一个 Binding。一个实现可以包含一个单独的对象,一个需要由 Guice 注入的类,或一个定制 的 provider。

当注入依赖关系时,Guice 首先寻找显式绑定,即你通过绑定器 Binder指明的绑定。 Binder API 使用生成器(Builder)模式来创建一种领域相关的描述语言。根据约束适用 方法的上下文的不同,不同方法返回不同的对象。

例如,为了将接口 Service 绑定到一个具体的实现 ServiceImpl,调用:

binder.bind(Service.class).to(ServiceImpl.class);

该绑定与下面的方法匹配:

@Inject void injectService(Service service) {   ... }

注: 与某些其他的框架相反,Guice 并没有给 "setter" 方法任何特殊待遇。不管方 法有几个参数,只要该方法含有 @Inject标注,Guice就会实施注入,甚至对基类中实现 的方法也不例外。

用Guice写Java(6)

时间:2011-04-02 王咏刚

不要重复自己

对每个绑定不断地重复调用"binder" 似乎有些乏味。Guice 提供了一个支持 Module 的类,名为 AbstractModule,它隐含地赋予你访问 Binder 的方法的权力。例如,我们 可以用扩展 AbstractModule 类的方式改写上述绑定:

bind(Service.class).to(ServiceImpl.class);

在本手册的余下部分中我们会一直使用这样的语法。

标注绑定

如果你需要指向同一类型的多个绑定,你可以用标注来区分这些绑定。例如,将接口 Service 和标注 @Blue 绑定到具体的实现类 BlueService 的代码如下:

bind(Service.class)

.annotatedWith(Blue.class)

.to(BlueService.class);

这个绑定会匹配以下方法:

@Inject void injectService(@Blue Service service) {   ... }

注意,标注 @Inject 出现在方法前,而绑定标注(如 @Blue)则出现在参数前。对构 造函数也是如此。使用字段注入时,两种标注都直接应用于字段,如以下代码:

@Inject @Blue Service service;

创建绑定标注

刚才提到的标注 @Blue 是从哪里来的?你可以很容易地创建这种标注,但不幸的是, 你必须使用略显复杂的标准语法:

/** * Indicates we want the blue version of a binding. */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.PARAMETER}) @BindingAnnotation public @interface Blue {}

幸运的是,我们不需要理解这些代码,只要会用就可以了。对于好奇心强的朋友,下 面是这些程式化代码的含义:

@Retention(RUNTIME) 使得你的标注在运行时可见。

@Target({FIELD, PARAMETER}) 是对用户使用的说明;它不允许 @Blue 被用于方法、 类型、局部变量和其他标注。

@BindingAnnotation 是 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号