【发布时间】:2014-07-02 08:33:48
【问题描述】:
我正在使用 Google Guice 编写一个组件,该组件位于一个不使用任何依赖注入工具的 Web 应用程序旁边。
组件中的 Guice 模块有一些不会更改的“固定”绑定和一对动态绑定,因为它们在来自 Web 应用程序的每个请求中都会更改。
我解决这个问题的简单(但不好)的方法是,每当 Web 应用程序第一次要求组件做某事时,组件都会构建新的 Guice 模块,创建实例并将其返回给 Web 应用程序:
public static X init(@NotNull final Foo perRequestObject, @NotNull final Bar perRequestObject2)
{
final Injector injector = Guice.createInjector(new AbstractModule()
{
@Override
protected void configure()
{
install(new NonChanging Module());
bind(Foo.class).toInstance(perRequestObject);
bind(Bar.class).toInstance(perRequestObject2);
}
});
return return injector.getInstance(X.class);
}
我认为这是一种不好的方法,因为为每个请求构建 Injector 的成本很高。我想要的是一个已经创建的注入器,我可以在运行时覆盖它。我在周围找到了一些东西:
1- 覆盖动态绑定(回答 https://stackoverflow.com/a/531110/1587864)。这仍然需要创建一个新的注入器,所以我会遇到同样的问题。
2- 实现某种已绑定在 Injector 中的工厂,并且能够访问来自 Web 应用程序且按请求提供的“动态”属性。
不知道第二个怎么实现,Guice 有这个概念吗?
谢谢
【问题讨论】:
-
Modules.override是否满足您的要求? -
这正是
@RequestScoped的用途。查看guice-servlet 文档。 -
@TavianBarnes RequestScoped 需要一个我无法获得的请求。我的案例将更关注线程范围而不是请求。有什么想法吗?
-
Guice wiki 在自定义范围上有一个article,它显示了一个示例线程特定范围。