用Guice写Java - 编程入门网
ovider(fromJndi(DataSource.class, "..."));
限制绑定的作用域 缺省情况下,Guice 为每次注入创建一个新的对象。我们把它称为“无作用域”。你 可以在配制绑定时指明作用域。例如,每次注入相同的实例: bind(MySingleton.class).in(Scopes.SINGLETON); 另一种做法是,你可以在实现类中使用标注来指明作用域。Guice 缺省支持 @Singleton:
使用标注的方法对于隐式绑定也同样有效,但需要 Guice 来创建你的对象。另一方面 ,调用 in() 适用于几乎所有绑定类型(显然,绑定到一个单独的实例是个例外)并且会 忽略已有的作用域标注。如果你不希望引入对于作用域实现的编译时依赖,in() 还可以 接受标注。 可以使用 Binder.bindScope() 为定制的作用域指定标注。例如,对于标注 @SessionScoped 和一个 Scope 的实现 ServletScopes.SESSION: binder.bindScope(SessionScoped.class, ServletScopes.SESSION); 创建作用域标注 用于指定作用域的标注必须: 有一个 @Retention(RUNTIME) 标注,从而使我们可以在运行时看到该标注。 有一个 @Target({TYPE}) 标注。作用域标注只用于实现类。 有一个 @ScopeAnnotation 元标注。一个类只能使用一个此类标注。 例如:
用Guice写Java(11)时间:2011-04-02 王咏刚尽早加载绑定 Guice 可以等到你实际使用对象时再加载单件对象。这有助于开发,因为你的应用程 序可以快速启动,只初始化你需要的对象。但是,有时你总是希望在启动时加载一个对象 。你可以告诉 Guice,让它总是尽早加载一个单件对象,例如: bind(StartupTask.class).asEagerSingleton(); 我们经常在我们的应用程序中使用这个方法实现初始化逻辑。你可以通过在 Guice 必 须首先初始化的单件对象上创建依赖关系来控制初始化顺序。 在不同作用域间注入 你可以安全地将来自大作用域的对象注入到来自小作用域或相同作用域的对象中。例 如,你可以将一个作用域为 HTTP 会话的对象注入到作用域为 HTTP 请求的对象中。但是 ,向较大作用域的对象中注入就是另一件事了。例如,如果你把一个作用域为 HTTP 请求 的对象注入到一个单件对象中,最好情况下,你会得到无法在 HTTP 请求中运行的错误信 息,最坏情况下,你的单件对象会总是引用来自第一个 HTTP 请求的对象。在这些时候, 你应该注入一个 Provider<T>,然后在需要的时候使用它从较小的作用域中获取对 象。这时,你必须确保,在 T 的作用域之外,永远不要调用这个提供者(例如,当目前 没有 HTTP 请求且 T 的作用域为 HTTP 请求的时候)。 开发阶段 Guice 明白你的应用开发需要经历不同的阶段。你可以在创建容器时告诉它应用程序 运行在哪一个阶段。Guice 目前支持“开发”和“产品”两个阶段。我们发现测试通常属 于其中某一个阶段。 在开发阶段,Guice 会根据需要加载单件对象。这样,你的应用程序可以快速启动, 只加载你正在测试的部分。 在产品阶段,Guice 会在启动时加载全部单件对象。这帮助你尽早捕获错误,提前优 化性能。 你的模块也可以使用方法拦截和其他基于当前阶段的绑定。例如,一个拦截器可能会 在开发阶段检查你是否在作用域之外使用对象。 拦截方法 Guice 使用 AOP Alliance API 支持简单的方法拦截。你可以在模块中使用 Binder 绑定拦截器。例如,对标注有 @Transactional 的方法应用事务拦截器:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |