java - GWT 项目中的单例

标签 java gwt dependency-injection singleton gwt-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),那么这里会发生什么?

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

问候

最佳答案

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

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

关于您的其他问题:

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

关于java - GWT 项目中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6382473/

相关文章:

java - 事务管理 spring 3 - hibernate 3.5

java - 错误: [error] Source '__libgdx_setup_tmp\prj-common\src\MyGame.gwt.xml' does not exist

带有 Set 子集合的 GWT RequestFactory

gwt - FabricJS 点击事件

c# - Moq - 为构造函数注入(inject)对象创建模拟实例

Java:使用第一次出现的拆分器从一个字符串中提取两个字符串?

Java程序 "freezes shortly"

Java GUI 锁定 - boolean 值未按预期工作?

c# - ASP.Net Core DI 的策略模式

c# - 使用 Unity 在配置中注册一个实例