Gwt 将@Singleton注入widgets字段

Gwt 将@Singleton注入widgets字段,gwt,dependency-injection,gwt-gin,Gwt,Dependency Injection,Gwt Gin,我已经阅读了大量的stackoverflow和其他资源,试图找到一个答案,也许我就是不明白 我正在尝试将一个GIN@Singleton注入应用程序客户端代码中的几个小部件和类中。使用Spring,我可以简单地使用正确的注释,任何东西几乎都可以在任何地方注入。使用GWT和GIN,除了构造函数之外,我似乎无法在任何地方注入。我不想注入构造函数,因为我正在处理一个非常大的项目,这几乎是不可能的 这些类中的一些是小部件,而另一些则不是。它们在整个应用程序中使用,有些被注入,有些被new实例化,还有一些两

我已经阅读了大量的stackoverflow和其他资源,试图找到一个答案,也许我就是不明白

我正在尝试将一个GIN@Singleton注入应用程序客户端代码中的几个小部件和类中。使用Spring,我可以简单地使用正确的注释,任何东西几乎都可以在任何地方注入。使用GWT和GIN,除了构造函数之外,我似乎无法在任何地方注入。我不想注入构造函数,因为我正在处理一个非常大的项目,这几乎是不可能的

这些类中的一些是小部件,而另一些则不是。它们在整个应用程序中使用,有些被注入,有些被new实例化,还有一些两者都有,这使得更改构造函数变得更加困难

我希望代码能像这样工作,但不明白它是如何与GIN一起工作的:

@Singleton
public class ApplicationData {

   public AppInfo getAppInfo() {
      return new AppInfo("My App Info");
   }
}

public class MyClass{
   @Inject protected ApplicationData applicationData;

   public void someMethod() {
      doSomething(applicationData.getAppInfo());
   }
}
有人把它编码成在演讲者中工作的代码,我有点理解它为什么工作,但我不完全理解它的概念。他们已经不在问了

这是我的一个黑客程序,它可以工作,但我不喜欢它:

@GinModules(GinModule.class)
public interface Injector extends Ginjector {
   final Injector INSTANCE = GWT.create(Injector.class);

   ApplicationData getApplicationData();
}

public class MyWidget extends Composite implements TakesValue<Integer>{

   public static interface MyWidgetUiBinder extends UiBinder<FormPanel, MyWidget>}

   private MyWidgetUiBinder uiBinder = GWT.create(MyWidgetUiBinder.class);
   private ApplicationData appData;

   public ArrivalTimeWidget() {
      appData = Injector.INSTANCE.getApplicationData();
      initWidget(uiBinder.createAndBindUi(this));
      someMethod(appData.getAppInfo());
   }
}
@GinModules(GinModule.class)
公共接口注入器{
最终注入器实例=GWT.create(Injector.class);
ApplicationData getApplicationData();
}
公共类MyWidget扩展复合实现TakesValue{
公共静态接口MyWidgetUiBinder扩展UiBinder}
私有MyWidgetUiBinder uiBinder=GWT.create(MyWidgetUiBinder.class);
私有应用程序数据应用程序数据;
公共到达时间窗口小部件(){
appData=Injector.INSTANCE.getApplicationData();
initWidget(uiBinder.createAndBindUi(this));
someMethod(appData.getAppInfo());
}
}

请帮助我正确地做这件事,而不是使用黑客。请把我当傻瓜一样对待,并给出充分的解释,因为说到这一点,我是愚蠢的。

答案是,我只能从已经被注入的对象中注入,就像@Thomas Broyer所说的那样。我是在创建“新”对象,而不是注入它们。

我很好奇Spring会有什么不同:如果GIN不注入字段,那一定是因为它不负责实例化类;我认为SpringDI也是如此。请浏览链接。这可能会对您有所帮助。@Ranna,所以这是我在该链接中看到的唯一有用的东西:“要进行依赖项注入,您需要使用注入器(如上所述)通过GIN初始化您的类。”所以,似乎我的1000个类都需要GIN实例化才能使用依赖项注入?这看起来很可笑,如果不是愚蠢的话。难道没有更好的方法吗,或者说杜松子酒还不够成熟?我上面展示的方法很有效,那么为什么GIN不能使用相同的原理向字段成员注入注释呢?在本质上似乎非常有限。要么如此,要么我还是不明白。@Thomas Spring可以扫描类以查找带注释的依赖项,没有一条规则要求用户通过一个单一入口点(如GIN)实例化所有内容(至少到目前为止我的理解是这样)。是的,但它不会注入它没有创建的对象:它如何知道这些对象已经创建并且需要注入?AFAICT Spring不使用代理插入代码…配置是通过类路径扫描和自动连接完成的,但一旦配置,它的工作原理几乎相同。