【发布时间】:2010-03-23 18:49:02
【问题描述】:
似乎所有 Guice 开箱即用的 Scope 实现本质上都是基于线程的(或完全忽略线程):
Scopes.SINGLETON 和 Scopes.NO_SCOPE 忽略线程并且是边缘情况:全局范围和无范围。
ServletScopes.REQUEST 和ServletScopes.SESSION 最终依赖于从ThreadLocal<Context> 检索作用域对象。检索到的Context 包含对HttpServletRequest 的引用,HttpServletRequest 包含对存储为命名属性的作用域对象的引用(其中名称派生自com.google.inject.Key)。
来自自定义范围 Guice wiki 的类 SimpleScope 还提供了使用 ThreadLocal<Map<Key<?>, Object>> 成员变量的每线程实现。
有了前言,我的问题是:如何创建一个非基于线程的作用域?我可以用来查找Map<Key<?>, Object> 的东西似乎丢失了,因为传递给Scope.scope() 的唯一东西是Key<T> 和Provider<T>。
提前感谢您的宝贵时间。
【问题讨论】:
-
如果您解释您希望 Scope 如何决定它应该创建一个新对象还是重用现有对象,这可能会有所帮助。另一种看待它的方式是您希望对象的生命周期是什么。