我的应用程序构建在Guice之上并运行预定作业(cron4j),这些作业显示了与固有的@Singleton实例相关的一些问题。
我的问题的适当解决方案似乎有适用于每个作业的Scope,而不是Singleton。它类似于请求范围,但在这种不同的情况下。
我已经阅读了docs for Custom Scopes,但我并不清楚特定依赖关系如何知道如何从guice请求特定范围的实例。
示例:
public class MyJob {
/* Knows its "run id", which could be used for the scoping mechanism */
@Inject private Dependency dep;
public void run() { ... }
}
public class Dependency {
/* Technically does not know the "run id" from the job */
@Inject @Named("jobRunScope") private InnerDependency innerDep;
}
我感谢任何指导。
答案 0 :(得分:1)
如果您查看the source for RequestScoped,您会看到它使用ThreadLocal
来存储特殊的Context
地图,其中包含当前请求的所有关键对象对。
如果您的作业在一个线程中运行,您可以使用类似的策略来存储作用域的单例。
另一种选择是为每个作业创建一个新的Injector
实例。