使用GWT的Gin问题 - 每次调用GWT.create(someClass.class)返回不同的实例

时间:2011-06-02 11:01:34

标签: java gwt guice gin

这是我的问题。我在一个gwt项目中使用Gin,我使用GWT.create(SomeClass.class)来获取实例,但问题是我想要signleton实例,为此我将app模块中的该类绑定为singleton。每个tome我执行GWT.create(TemplatePanel.class)它返回不同的实例..为什么? 这是我的代码片段。 模块

public class AppClientModule extends AbstractGinModule
{
protected void configure()
{
  bind(MainPanel.class).in(Singleton.class);
  bind(TemplatePanel.class).in(Singleton.class);
}
} 

注射器

@GinModules(AppClientModule.class)
public interface AppInjector extends Ginjector
{
  MainPanel getMainForm();
  TemplatePanel getTemplateForm();
}

TemplatePanel

public class TemplatePanel extends VerticalPanel
@Inject
public TemplatePanel()
{
  this.add(initHeader());
  this.add(initContent());
}
..

mainPanel中

public void onSuccess(List<MyUser> result)
    {
.......
  TemplatePanel temp = GWT.create(TemplatePanel.class);

.......
}

入口点

private final AppInjector injector = GWT.create(AppInjector.class);
public void onModuleLoad()
{
  MainPanel mf = injector.getMainForm();
  TemplatePanel template = injector.getTemplateForm();
  template.setContent(mf);
  RootPanel.get().add(template);
}

2 个答案:

答案 0 :(得分:7)

GWT.create(..)不适用于GIN,只是以正常的GWT方式创建对象。你应该:

  1. TemplatePanel或{/ p>

  2. 中注入MainPanel
  3. 实例化注入器(可能通过静态方法),然后获取TemplatePanel

  4. 我通常有一个静态引用注入器(因为你每个应用只需要一个)所以我可以在任何地方访问它:

    @GinModules(AppClientModule.class)
    public interface AppInjector extends Ginjector
    {
        AppInjector INSTANCE = GWT.create(AppInjector.class);
    
        MainPanel getMainForm();
        TemplatePanel getTemplateForm();
    }
    

    (注意:常量接口字段的定义是public和static,所以你可以省略它们。)

    然后你会使用:

    TemplatePanel temp = AppInjector.INSTANCE.getTemplateForm();
    

答案 1 :(得分:0)

GWT.create只需调用新的XXX,其中XXX是您传递给它的类文字。然而,当XXX类在为其定义的模块(即Deferred Binding)中有一些规则时,它确实有些神奇。我可以Gwt.create(YYY)并且有一条规则说如果用户代理是Internet Explorer 2那么它会使用ZZZ。