GWT项目中的单身人士

时间:2011-06-17 07:07:28

标签: java gwt dependency-injection singleton gin

有些人可以解释一下。这是一些情况。

假设我有一个类模板并在应用程序中使用Gin / Guice。

@Singleton
public class Template extends Compose
{
private HorizontalPanel header;
private HorizontalPanel content;
private VerticalPanel menu;

    public Template()
    {
      this.add(initHeader());
      this.add(initMenu());
      this.add(initContent());
    }

    public void setContent(Widget widget)
    {
      content.clear();
      content.add(widget);
    }
    .............
    ......
    }

并在入门课程中

........
public void onModuleLoad()
{

RootPanel.get().add(new Template());
....
}

每次我需要重新加载我做的内容..

例如

HorizontalPanel hp = new HorizontalPanel();
hp.add ....
...

Template template = injector.getTemplate(); // return singleton instance using gin
template.setContent(hp)

依旧......

所以,模板是单例,据我所知,单个实例是每个VM一个意味着整个应用程序共享,对吧? 模板类具有标题,菜单和内容,其目的是仅将内容部分重新加载为清理和添加小部件。 但这是一个好方法吗?

例如,我们是否可能遇到类似用户“A”setContent(widgetA)的情况,但同时用户“B”使用方法setContent(widgetB),那么这里会发生什么?

谢谢,如果有人最终可以与我分享一个好的方法并评论那个。

此致

3 个答案:

答案 0 :(得分:12)

@Singleton的范围限定为Ginjector个实例(是的,如果您GWT.create()两次GInjector,您将获得两个“单身人士”)。没有任何单一的意思GIN可以以某种方式“拦截”new Template()中的onModuleLoad,因此injector.getTemplate()将返回一个不同的template实例。 (这与Stein谈论的“单身代码反模式”完全不同,使用static状态)

没有魔力:GIN是一个代码生成器,它只会编写您可以手动输入的代码。

至于你的其他问题:

  • 您的客户端代码显然在客户端上运行,即在浏览器上运行。每个浏览器选项卡/窗口都有一个“应用程序实例”显示您的应用程序。同时没有“用户A”和“用户B”。
  • JavaScript是单线程的,因此您不必担心并发访问。

答案 1 :(得分:1)

我为我们的应用程序注入了具有通用RPC代码的类。 方法如下:

@Singleton
public class SomeService {

/** The real service. */
private static final RealServiceAsync realService;

...

}

我们的Gin模块:

public class MyGinModule extends AbstractGinModule {

    @Override
    protected void configure() {
        bind( SomeService .class ).in(Singleton.class);
        ...
        ...
    }

}

它以单身注入如下:

public class ApplicationInfoPresenter {

@Inject
private SomeService service;

...
...

}

答案 2 :(得分:0)

我很确定GWT编译器会忽略注释。

当我需要在gwt中使用Singleton时,我只需创建一个带有私有/受保护构造函数的类,以及一个private static NameOfSingletonClass instance;getInstance()方法,如果为null,则初始化该实例并返回实例。