快速业务通道

用Guice写Java - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
性值的标注实例,它会去 找一个绑定到该标注类型的绑定。

例如,我们有一个绑定标注 @Named,它有一个字符串属性值。

@Retention(RUNTIME)
@Target({ FIELD, PARAMETER })
@BindingAnnotation
public @interface Named { 
String value();
}

用Guice写Java(7)

时间:2011-04-02 王咏刚

如果我们希望绑定到 @Named("Bob"),我们首先需要一个 Named 的实现。我们的实现 必须遵守关于 Annotation 的约定,特别是 hashCode() 和 equals() 的实现。

class NamedAnnotation implements Named { 
final String value; 
public NamedAnnotation(String value) {  
this.value = value; 
} 
public String value() {  
return this.value; 
} 
public int hashCode() {  
// This is specified in java.lang.Annotation.  
return 127 * "value".hashCode() ^ value.hashCode(); 
} 
public boolean equals(Object o) {  
if (!(o instanceof Named))   
return false;  
Named other = (Named) o;  
return value.equals(other.value()); 
} 
public String toString() {  
return "@" + Named.class.getName() + "(value=" + value + ")"; 
} 
public Class<? extends Annotation> annotationType() {  
return Named.class; 
}
}

现在我们可以使用这个标注实现来创建一个指向 @Named 的绑定。

bind(Person.class)

.annotatedWith(new NamedAnnotation("Bob"))

.to(Bob.class);

与其它框架使用基于字符串的标识符相比,这显得有些繁琐,但记住,使用基于字符 串的标识符,你根本无法这样做。而且,你会发现你可以大量复用已有的绑定标注。

因为通过名字标记一个绑定非常普遍,以至于 Guice 在 com.google.inject.name 中 提供了一个十分有用的 @Named 的实现。

用Guice写Java(8)

时间:2011-04-02 王咏刚

隐式绑定

正如我们在简介中看到的那样,你并不总是需要显式地声明绑定。如果缺少显式绑定 ,Guice 会试图注入并创建一个你所依赖的类的新实例。如果你依赖于一个接口,Guice 会寻找一个指向具体实现的 @ImplementedBy 标注。例如,下例中的代码显式绑定到一个 具体的、可注入的名为 Concrete 的类。它的含义是,将 Concrete 绑定到 Concrete。 这是显式的声明方式,但也有些冗余。

bind(Concrete.class);

删除上述绑定语句不会影响下面这个类的行为:

class Mixer {   @Inject   Mixer(Concrete concrete) {    ...   } }

好吧,你自己来选择:显式的或简略的。无论何种方式,Guice 在遇到错误时都会生 成有用的信息。

注入提供者

有时对于每次注入,客户代码需要某个依赖的多个实例。其它时候,客户可能不想在 一开始就真地获取对象,而是等到注入后的某个时候再获取。对于任意绑定类型 T,你可 以不直接注入 T 的实例,而是注入一个 Provider<T>,然后在需要的时候调用 Provider<T>.get(),例如:

@Inject void injectAtm(Provider<Money> atm) {   Money one = atm.get();   Money two = atm.get();   ... }

正如你所看到的那样, Provider 接口简单得不能再简单了,它不会为简单的单元测 试添加任何麻烦。

注入常数值

对于常数值,Guice 对以下几种类型做了特殊处理:

基本类型(int, char, ...)

基本封装类型(Integer, Character, ...)

Strings

Enums

Classes

首先,当绑定到这些类型的常数值的时候,你不需要指定你要绑定到的类型。Guice 可以根据值判断类型。例如,一个绑定标注名为 TheAnswer:

bindConstant().annotatedWith(TheAnswer.class).to(42);

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