快速业务通道

用Guice写Java - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

它的效果等价于:

bind(int.class).annotatedWith(TheAnswer.class).toInstance(42);

当需要注入这些类型的数值时,如果 Guice 找不到指向基本数据类型的显式绑定,它 会找一个指向相应的封装类型的绑定,反之亦然。

用Guice写Java(9)

时间:2011-04-02 王咏刚

转换字符串

如果 Guice 仍然无法找到一个上述类型的显式绑定,它会去找一个拥有相同绑定标注 的常量 String 绑定,并试图将字符串转换到相应的值。例如:

bindConstant().annotatedWith(TheAnswer.class).to("42"); // String!

会匹配:

@Inject @TheAnswer int answer;

转换时,Guice 会用名字去查找枚举和类。Guice 在启动时转换一次,这意味着它提 前做了类型检查。这个特性特别有用,例如,当绑定值来自一个属性文件的时候。

定制的提供者

有时你需要手工创建你自己的对象,而不是让 Guice 创建它们。例如,你可能不能为 来自第三方的实现类添加 @Inject 标注。在这种情况下,你可以实现一个定制的 Provider。Guice 甚至可以注入你的提供者类。例如:

class WidgetProvider implements Provider<Widget> {   final Service service;   @Inject   WidgetProvider(Service service) {    this.service = service;   }   public Widget get() {    return new Widget(service);   } }

你可以像这样把 Widget 绑定到 WidgetProvider:

bind(Widget.class).toProvider(WidgetProvider.class);

注入定制的提供者可以使 Guice 提前检查类型和依赖关系。定制的提供者可以在任意 作用域中使用,而不依赖于他们所创建的类的作用域。缺省情况下,Guice 为每一次注入 创建一个新的提供者实例。在上例中,如果每个 Widget 需要它自己的 Service 实例, 我们的代码也没有问题。通过在工厂类上使用作用域标注,或为工厂类创建单独的绑定, 你可以为定制的工厂指定不同的作用域。

示例:与 JNDI 集成

例如我们需要绑定从 JNDI 得到的对象。我们可以仿照下面的代码实现一个可复用的 定制的提供者。注意我们注入了 JNDI Context:

package mypackage; import com.google.inject.*; import javax.naming.*; class JndiProvider<T> implements Provider<T> {   @Inject Context context;   final String name;   final Class<T> type;   JndiProvider(Class<T> type, String name) {    this.name = name;    this.type = type;   }   public T get() {    try {     return type.cast(context.lookup(name));    }    catch (NamingException e) {     throw new RuntimeException(e);    }   }   /**   * Creates a JNDI provider for the given   * type and name.   */   static <T> Provider<T> fromJndi(     Class<T> type, String name) {    return new JndiProvider<T>(type, name);   } }

用Guice写Java(10)

时间:2011-04-02 王咏刚

感谢泛型擦除(generic type erasure)技术。我们必须在运行时将依赖传入类中。 你可以省略这一步,但在今后跟踪类型转换错误会比较棘手(当 JNDI 返回错误类型的对 象的时候)。

我们可以使用定制的 JndiProvider 来将 DataSource 绑定到来自 JNDI 的一个对象 :

import com.google.inject.*; import static mypackage.JndiProvider.fromJndi; import javax.naming.*; import javax.sql.DataSource; ... // Bind Context to the default InitialContext. bind(Context.class).to(InitialContext.class); // Bind to DataSource from JNDI. bind(DataSource.class)    .toPr

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