快速业务通道

用Guice写Java - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
               // Match classes.   annotatedWith(Transactional.class), // Match methods.   new TransactionInterceptor()    // The interceptor. );

尽量让匹配代码多做些过滤工作,而不是在拦截器中过滤。因为匹配代码只在启动时 运行一次。

静态注入

静态字段和方法会增加测试和复用的难度,但有的时候你唯一的选择就是保留一个 Injector 的静态引用。

在这些情况下,Guice 支持注入可访问性较少的静态方法。例如,HTTP 会话对象经常 需要被串行化,以支持复制机制。但是,如果你的会话对象依赖于一个作用域为容器生命 周期的对象,该怎么办呢?我们可以保留一个该对象的临时引用,但在反串行化的时候, 我们该如何再次找到该对象呢?

我们发现更实用的解决方案是使用静态注入:

@SessionScoped class User {   @Inject   static AuthorizationService authorizationService;   ... }

Guice 从不自动实施静态注入。你必须使用 Binder 显式请求 Injector 在启动后注 入你的静态成员:

binder.requestStaticInjection(User.class);

静态注入是一个很难避免的祸害,它会使测试难度加大。如果有办法避开它,你多半 会很高兴的。

用Guice写Java(12)

时间:2011-04-02 王咏刚

可选注入

有时你的代码应该在无论绑定是否存在的时候都能工作。在这些情况下,你可以使用 @Inject(optional=true),Guice 会在有绑定可用时,用一个绑定实现覆盖你的缺省实现 。例如:

@Inject(optional=true) Formatter formatter = new DefaultFormatter();

如果谁为 Formatter 创建了一个绑定,Guice 会基于该绑定注入实例。否则,如果 Formatter 不能被注入(参见隐式绑定),Guice 会忽略可选成员。

可选注入只能应用于字段和方法,而不能用于构造函数。对于方法,如果一个参数的 绑定找不到,Guice 就不会注入该方法,即便其他参数的绑定是可用的。

绑定到字符串

只要有可能,我们就尽量避免使用字符串,因为它们容易被错误拼写,对工具不友好 ,等等。但使用字符串而不是创建定制的标注对于“快而脏”的代码来说仍是有用的。在 这些情况下,Guice 提供了@Named 和 Names。例如,一个到字符串名字的绑定:

import static com.google.inject.name.Names.*;

...

bind(named("bob")).to(10);

会匹配下面的注入点:

@Inject @Named("bob") int score;

Struts 2支持

要在 Struts 2.0.6 或更高版本中安装 Guice Struts 2 插件,只要将 guice- struts2-plugin-1.0.jar 包含在你的 Web 应用的 classpath 中,并在 struts.xml 文 件中选择 Guice 作为你的 ObjectFactory 实现即可:

<constant name="struts.objectFactory" value="guice" />

Guice 会注入所有你的 Struts 2 对象,包括动作和拦截器。你甚至可以设置动作类 的作用域。你也可以在你的 struts.xml 文件中指定 Guice 的 Module:

<constant name="guice.module" value="mypackage.MyModule"/>

如果你的所有绑定都是隐式的,你就根本不用定义模块了。

一个计数器的例子

例如,我们试图统计一个会话中的请求数目。定义一个在会话中存活的 Counter 对象 :

@SessionScoped public class Counter {   int count = 0;   /** Increments the count and returns the new value. */   public synchronized int increment() {    return count++;   } }

用Guice写Java(13)

时间:2011-04-02 王咏刚

接下来,我们可以将我们的计数器注入到动作中:

public class Count {   final Counter counter;   @Inject   public Count(Counter counter)

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