我有一个关于使用Gin注入GWT异步RPC服务的问题。
我有两个类都使用相同的异步服务:
class TheViewA {
@Inject
public TheViewA(MyServiceAsync myServiceASync) {
....
}
}
class TheViewB {
@Inject
public TheViewB(MyServiceASync myServiceASync) {
....
}
}
这很好。但是,我发现这将导致GWT内部调用:
GWT.create(MyServiceASync.class)
每次注射两次。我不知道这样做的缺点是什么,但是我认为它们可以共享一个MyServiceAsync实例。
有人可以告诉我如何配置Gin(Guice),以便只为两个注入创建MyServiceAsync的一个实例吗?
还是可以为注入创建单独的实例,为什么?
非常感谢。
最佳答案
注入时,如果Gin
找不到给定类型的绑定,它将自动回退到GWT.create()
来创建实例。这就是为什么ClientBundle
/ GWT-RPC
/ i18n
之类的东西只是Just Works,而不必将它们绑定到您自己的AbstractGinModule
扩展名中的原因。
当然,当Gin
找到另一个相同类型的注入时,它将注入另一个实例。要创建和注入单例实例,只需将您的GWT-RPC
异步服务接口绑定到@Singleton
范围。像这样:
public class YourModule extends AbstractGinModule {
@Override
protected void configure() {
bind(MyServiceAsync.class).in(Singleton.class);
}
}
或者,您可以创建一个总是返回单例实例的
Provider<MyServiceAsync>
,但是以前的方法要简单得多。通常首选在整个应用程序中注入单例异步实例。