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