gpt4 book ai didi

scope - 如何创建非基于线程的 Guice 自定义 Scope?

转载 作者:行者123 更新时间:2023-12-05 00:07:00 27 4
gpt4 key购买 nike

似乎所有 Guice 的开箱即用 Scope 实现本质上都是基于线程的(或完全忽略线程):
Scopes.SINGLETONScopes.NO_SCOPE忽略线程并且是边缘情况:全局范围和无范围。
ServletScopes.REQUESTServletScopes.SESSION最终取决于从 ThreadLocal<Context> 检索范围对象.检索到的 Context持有对 HttpServletRequest 的引用保存对存储为命名属性的作用域对象的引用(其中 name 派生自 com.google.inject.Key )。

类(class)SimpleScope来自自定义范围的 Guice wiki 还提供了使用 ThreadLocal<Map<Key<?>, Object>> 的每线程实现。成员变量。

有了这个序言,我的问题是:如何创建非基于线程的作用域?似乎我可以用来查找 Map<Key<?>, Object> 的东西丢失,因为唯一传递给 Scope.scope() 的东西是 Key<T>和一个 Provider<T> .

在此先感谢您的时间。

最佳答案

有点不清楚您想要什么 - 您不想要基于线程的范围,并且您不想要忽略线程的范围。

但是是的,范围旨在管理对象的生命周期并说明何时应该重用实例。所以你真的在问“除了‘总是使用同一个实例’、‘从不使用同一个实例’和‘根据当前线程的执行环境使用一个实例’之外,重用实例的其他可能性是什么? ?”

以下是我想到的:

  • 在固定的时间内使用相同的实例。此处的示例是每十分钟重新加载和重新解析一次的配置文件。
  • 执行一些网络调用来查询是否应该重用给定的对象(也许这是一个确定我们是否需要重构对象的快速调用,但重构对象的调用很慢)
  • 重复使用相同的对象,直到一些外部调用进来告诉我们重新加载
  • 每个线程重用相同的对象,但不能像 servlet 作用域那样使用显式进入和离开的作用域。 (所以每个线程一个实例)
  • 基于 InheritableThreadLocal 的“此线程和子线程”范围,不是普通的 ThreadLocal .
  • 与此相关的是 Scope和基于线程池的 ExecutorService一起工作,以便在线程和它提交用于后台执行的作业之间共享实例。
  • 从池中拉出实例;这很棘手,因为我们需要一种在完成后将对象返回到池中的好方法。 (也许你可以将这个想法与请求范围之类的东西结合起来,以便在请求结束时对象可以返回到池中)
  • 一个由两个或多个其他范围组成的范围,例如,我们可以获得一个配置对象,该对象每 10 分钟重新读取一次,除非在给定请求的整个生命周期中使用相同的实例。
  • 关于scope - 如何创建非基于线程的 Guice 自定义 Scope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2502725/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com