使用GIN在GWT中注入入口点类

时间:2011-06-27 15:34:39

标签: java gwt dependency-injection gin

我试过这样的事情:

@Singleton
public class AAA implements EntryPoint, HistoryListener
{

private BBB bbb;
private CCC ccc;
private DDD ddd;
private EEE eee;

@Inject
public AAA(BBB bbb, CCC ccc, DDD ddd, EEE eee)
{
  this.bbb = bbb;
  this.ccc = ccc;
  this.ddd = ddd;
  this.eee = ee;
}
.........
}

结果对所有实例都为null .. 我期望这种方式起作用......

我知道我可以做这样的事情,例如

private final MyGinjector injector = GWT.create(MyGinjector.class);

injector.getAAA()
and so on..

为什么我尝试的第一种方式对我不起作用? 有什么建议吗?

由于

2 个答案:

答案 0 :(得分:7)

您可以使用Guice的injectMembers功能,在GIN中通过在Ginjector中声明一个方法来完成一个参数。

@GinModules(...)
interface MyGinjector extends Ginjector {

   public void injectEntryPoint(AAA entryPoint);

   ...
}

public class AAA implements EntryPoint {
   @Inject private BBB bbb; // field injection works
   private CCC ccc;

   @Inject void setCcc(CCC ccc) { this.ccc = ccc; } // and of course method injection

   public onModuleLoad() {
      MyGinjector injector = GWT.create(MyGinjector.class);
      injector.injectEntryPoint(this);
      ...
   }
}
顺便说一句,你不需要用@Singleton注释你的EntryPoint:除非你把它注入另一个类(并且你不得不求助于黑客将它绑定到GWT创建的实例,而不是让GIN创建自己的),你的应用程序中只有一个EntryPoint实例。

答案 1 :(得分:3)

GIN取决于GWT,因此GIN知道GWT,但GWT不知道GIN。

因此,通过GWT.create(AAA.class)初始化类将以正常的GWT方式初始化AAA,而不使用GIN,这意味着没有依赖注入。

要进行依赖注入,您需要使用注入器通过GIN初始化类(如上所述)。