Java GWT项目中的单例

Java GWT项目中的单例,java,gwt,dependency-injection,singleton,gwt-gin,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());

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

假设我有一个类模板,并在应用程序中使用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),那么这里会发生什么呢

谢谢,如果有人能和我分享一个好的方法,并评论一下


关于

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


当我在gwt中需要一个单例时,我只需创建一个具有私有/受保护构造函数的类,以及一个SingleToClass实例的
私有静态名称
和一个
getInstance()
方法,该方法在null时初始化实例并返回实例

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


当我在gwt中需要一个单例时,我只需创建一个具有私有/受保护构造函数的类,以及一个SingleToClass实例的
私有静态名称
和一个
getInstance()
方法,该方法在null时初始化实例并返回实例

@Singleton
的作用域是
Ginjector
实例(是的,如果您
GWT.create()
your
Ginjector
两次,您将得到两个“Singleton”)。没有任何一种方法意味着GIN可以在
onModuleLoad
中以某种方式“拦截”您的
new Template()
,因此
injector.getTemplate()
将返回一个不同的
Template
实例。 (这与Stein使用
static
state谈论的“单例代码反模式”完全不同)

这并没有什么神奇之处:GIN是一个代码生成器,它只编写可以手工输入的代码

至于你的其他问题:

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

的作用域是
Ginjector
实例(是的,如果你
GWT.create()
你的
Ginjector
两次,你会得到两个“Singleton”)。没有任何一种方法意味着GIN可以在
onModuleLoad
中以某种方式“拦截”您的
new Template()
,因此
injector.getTemplate()
将返回一个不同的
Template
实例。 (这与Stein使用
static
state谈论的“单例代码反模式”完全不同)

这并没有什么神奇之处:GIN是一个代码生成器,它只编写可以手工输入的代码

至于你的其他问题:

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

我为这个类注入了我们应用程序的通用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;

...
...

}

我已经为这个类注入了我们应用程序的通用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;

...
...

}

如果我错了,请纠正我(我已经有一段时间没有使用Java了),但看起来并没有任何东西实际将该对象强制为单例对象。当然,你在用那个装饰师标记它,但我认为它不会给你带来魔力。根据我的经验,您必须使用Guice(Gin代表GWT)这样的DI系统。这是我没有提到的错误,我在该应用程序中使用Gin/Guice。我会更新这篇文章。如果我错了,请纠正我(我有一段时间没有使用Java了),但看起来并没有任何东西实际将该对象强制为单例对象。当然,你在用那个装饰师标记它,但我认为它不会给你带来魔力。根据我的经验,您必须使用Guice(Gin代表GWT)这样的DI系统。这是我没有提到的错误,我在该应用程序中使用Gin/Guice。我将更新post.DI模式来处理singleton,在我的例子中是Gin/Guice。问题是因为模板是单例的,它是否由整个应用程序共享,以及当不同用户通过setContent()方法设置其内容时会发生什么?(不知道Gin)如果单例在gwt代码(前端)中,则每个浏览器窗口将有一个单例。不同的用户使用不同的计算机,当然不会共享singleton。(如果在后端使用,这将取决于Web服务器的工作方式[很可能是每个线程/会话一个或更多]),谢谢Stein。这就是我想知道的!Singleton是每个浏览器窗口共享的,或者更确切地说是由浏览器javascript线程共享的。可能有些(旧的)浏览器可能无法正确地分隔javascript线程的名称空间(尽管这对安全性非常不利)。您可以在firefox和chrome(可能还有其他)的两个选项卡中运行相同的应用程序,而不受干扰,尽管同一域的所有选项卡/窗口之间可能共享any session cookie,这使得单例不太可能成为问题……DI模式执行单例,在我的例子中是Gin/Guice。问题是因为模板是单例的,它是由整个应用程序共享的吗?当不同的用户通过setContent()方法设置他们的内容时会发生什么?(不知道Gin)如果单例在gwt代码中(fr