Java GWT项目中的单例
能给我解释一下吗。下面是一些场景 假设我有一个类模板,并在应用程序中使用Gin/GuiceJava 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());
@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()
yourGinjector
两次,您将得到两个“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是单线程的,所以您也不必担心并发访问
@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