似乎所有 Guice 开箱即用的 Scope 实现本质上都是基于线程的(或完全忽略线程):
Scopes.SINGLETON
并Scopes.NO_SCOPE
忽略线程并且是边缘情况:全局范围和无范围。
ServletScopes.REQUEST
并ServletScopes.SESSION
最终依赖于从ThreadLocal<Context>
. 检索Context
到的HttpServletRequest
包含对 的引用,该引用包含对存储为命名属性(其中名称派生自com.google.inject.Key
)的范围对象的引用。
自定义范围 Guice wiki 中的类还使用成员变量SimpleScope
提供了每个线程的实现。ThreadLocal<Map<Key<?>, Object>>
有了这个序言,我的问题是:如何创建一个非基于线程的作用域?似乎我可以用来查找 aMap<Key<?>, Object>
的东西丢失了,因为传入的唯一东西Scope.scope()
是 aKey<T>
和 a Provider<T>
。
在此先感谢您的时间。