似乎所有Guice开箱即用的Scope实现本质上都是基于线程的(或完全忽略线程):
Scopes.SINGLETON
和Scopes.NO_SCOPE
忽略线程并且是边缘情况:全局范围,没有范围。
ServletScopes.REQUEST
和ServletScopes.SESSION
最终依赖于从ThreadLocal<Context>
检索范围对象。检索到的Context
包含对HttpServletRequest
的引用,该引用包含对作为命名属性存储的作用域对象的引用(其中name源自com.google.inject.Key
)。
类SimpleScope
Guice wiki还使用ThreadLocal<Map<Key<?>, Object>>
成员变量提供每线程实现。
有了这个序言,我的问题是:如何创建一个非基于线程的范围?似乎我可以用来查找Map<Key<?>, Object>
的内容丢失,因为传递给Scope.scope()
的唯一内容是Key<T>
和Provider<T>
。
提前感谢您的时间。
答案 0 :(得分:7)
有点不清楚你想要什么 - 你不想要基于线程的作用域,并且你不想要忽略线程的作用域。
但是,是的,范围旨在管理对象的生命周期,并说明何时应该重用实例。所以你真的要问“除了'总是使用相同的实例','永远不要使用相同的实例',以及'根据当前线程的执行环境使用实例'时,重新使用实例的其他可能性是什么? ?“
以下是我想到的:
InheritableThreadLocal
,而不是普通ThreadLocal
。Scope
和基于线程池的ExecutorService
工作,以便在线程和它提交的作业之间共享实例以供后台执行。