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

Java 使用GWT-GWT.create(someClass.class)时出现的Gin问题每次调用时都返回不同的实例,java,gwt,guice,gwt-gin,Java,Gwt,Guice,Gwt Gin,这是我的问题。我在一个gwt项目中使用Gin,我使用gwt.create(SomeClass.class)来获取实例,但问题是我想要signleton实例,为此,我在应用程序模块中将该类绑定为singleton。我执行GWT.create(TemplatePanel.class)时,它会返回不同的实例。为什么?? 下面是我的代码片段。 模块 注射器 @GinModules(AppClientModule.class) public interface AppInjector extends Gi

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

注射器

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

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

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

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

  • MainPanel
    中插入
    TemplatePanel
    ,或

  • 实例化注射器(可能通过静态方法),然后获取
    TemplatePanel

  • 我通常对injector有一个静态引用(因为每个应用程序只需要一个),所以我可以在任何地方访问它:

    @GinModules(AppClientModule.class)
    public interface AppInjector extends Ginjector
    {
        AppInjector INSTANCE = GWT.create(AppInjector.class);
    
        MainPanel getMainForm();
        TemplatePanel getTemplateForm();
    }
    
    (注意:常量接口字段根据定义是公共的和静态的,因此您可以忽略它们。)

    然后你会使用:

    TemplatePanel temp = AppInjector.INSTANCE.getTemplateForm();
    
    GWT.create(…)
    不适用于GIN,它只是以正常的GWT方式创建一个对象。你应该:

  • MainPanel
    中插入
    TemplatePanel
    ,或

  • 实例化注射器(可能通过静态方法),然后获取
    TemplatePanel

  • 我通常对injector有一个静态引用(因为每个应用程序只需要一个),所以我可以在任何地方访问它:

    @GinModules(AppClientModule.class)
    public interface AppInjector extends Ginjector
    {
        AppInjector INSTANCE = GWT.create(AppInjector.class);
    
        MainPanel getMainForm();
        TemplatePanel getTemplateForm();
    }
    
    (注意:常量接口字段根据定义是公共的和静态的,因此您可以忽略它们。)

    然后你会使用:

    TemplatePanel temp = AppInjector.INSTANCE.getTemplateForm();
    

    create只调用newxxx,其中XXX是传递给它的类文本。然而,当XXX类在为其定义的模块(也称为延迟绑定)中有一些规则时,它确实发挥了一些魔力。我建议您可以Gwt.create(YYY),并且有一条规则规定,如果用户代理是Internet Explorer 2,那么它将使用ZZZ。

    Gwt.create只调用new XXX,其中XXX是您传递给它的类文本。然而,当XXX类在为其定义的模块(也称为延迟绑定)中有一些规则时,它确实发挥了一些魔力。我告诉你,你可以Gwt.create(YYY),有一条规则说,如果用户代理是Internet Explorer 2,那么它将使用ZZZ。

    Peter,我还有一个问题,我知道你熟悉Gin。当我创建任何布局/小部件的实例(例如HorizontalPanel)时,您是注入它还是使用新的HorizontalPanel()。。。如果你注射它,你是怎么做的?再次感谢。我总是使用UiBinder,在创建/注入小部件方面没有问题。但在极少数情况下,我使用
    new
    作为小部件。在您可能希望用其他实现(即在测试场景中)替换类/对象的级别上,注入非常有用。对于小部件,您通常不需要这样做,因为您切换了整个视图实现。当我创建任何布局/小部件的实例(例如HorizontalPanel)时,您是注入它还是使用新的HorizontalPanel()。。。如果你注射它,你是怎么做的?再次感谢。我总是使用UiBinder,在创建/注入小部件方面没有问题。但在极少数情况下,我使用
    new
    作为小部件。在您可能希望用其他实现(即在测试场景中)替换类/对象的级别上,注入非常有用。对于小部件,您通常不需要这样做,因为您可以切换整个视图实现。