【问题标题】:GWT Gin Async Service InjectionGWT Gin 异步服务注入
【发布时间】:2013-03-16 14:36:44
【问题描述】:

我有一个关于使用 Gin 注入 GWT Async RPC 服务的问题。

我有两个类都使用相同的异步服务:

class TheViewA {    
    @Inject
    public TheViewA(MyServiceAsync myServiceASync) {
        ....
    }
}


class TheViewB {
    @Inject
    public TheViewB(MyServiceASync myServiceASync) {
        ....
    }
}

这很好用。但是,我发现这会导致 GWT 内部调用:

GWT.create(MyServiceASync.class) 

每次注射两次。我不知道这样做有什么缺点,但我认为它们可以共享一个 MyServiceAsync 实例。

谁能告诉我如何配置 Gin (Guice) 以便只为两个注入创建一个 MyServiceAsync 实例?

或者是否可以为注入创建单独的实例?为什么?

非常感谢。

【问题讨论】:

  • 最好有单例实例的异步类性能明智。不过我不确定杜松子酒。
  • @SSR 你能详细说明一下吗?编译的代码远程服务异步代码非常简单,我不确定创建更少的实例会更好......
  • 我们已经分析并解释了远程服务异步的创建需要时间(大约几年前)并转向单例方法。

标签: java gwt guice gwt-gin


【解决方案1】:

在注入方面,如果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>,但之前的方法要简单得多。

在整个应用程序中注入单例异步实例通常是首选。

【讨论】:

  • 回答另一个问题,是的,创建多个 RPC 实例是可以的——它们不持有任何状态,因此创建更多实例不会使用可观的内存量。添加Singleton 范围是避免创建其他实例的正确方法,但在这种情况下,我真的不用担心——我从未听说过或看到过更喜欢单例的理由。相比之下,RequestFactory 需要您可以避免的设置,但我也不确定在那里是否值得。
猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2011-09-07
  • 2022-08-03
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多