有些人可以解释一下。这是一些情况。
假设我有一个类模板并在应用程序中使用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),那么这里会发生什么?
谢谢,如果有人最终可以与我分享一个好的方法并评论那个。
此致
答案 0 :(得分:12)
@Singleton
的范围限定为Ginjector
个实例(是的,如果您GWT.create()
两次GInjector
,您将获得两个“单身人士”)。没有任何单一的意思GIN可以以某种方式“拦截”new Template()
中的onModuleLoad
,因此injector.getTemplate()
将返回一个不同的template
实例。
(这与Stein谈论的“单身代码反模式”完全不同,使用static
状态)
没有魔力:GIN是一个代码生成器,它只会编写您可以手动输入的代码。
至于你的其他问题:
答案 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,则初始化该实例并返回实例。