GWT项目中的Singleton



有人能给我解释一下吗。下面是一些场景。

假设我有一个类模板,并在应用程序中使用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)

等等。

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

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

谢谢,如果有人最终能和我分享一个好的方法并对此发表评论的话。

问候

@Singleton的作用域是Ginjector实例(是的,如果您两次GWT.create()GInjector,您将获得两个"singleton")。没有一个单一的平均GIN可以以某种方式在onModuleLoad中"拦截"new Template(),因此injector.getTemplate()将返回一个不同的template实例。(这与Stein所说的使用static状态的"单例代码反模式"完全不同)

没有什么神奇之处:GIN是一个代码生成器,它只编写您可以手动键入的代码。

至于你的其他问题:

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

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

@Singleton
public class SomeService {
/** The real service. */
private static final RealServiceAsync realService;
...
}

我们的杜松子酒模块:

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

它被注入为singleton,如下所示:

public class ApplicationInfoPresenter {
@Inject
private SomeService service;
...
...
}

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

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

相关内容

  • 没有找到相关文章

最新更新