我试过这样的事情:
@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..
为什么我尝试的第一种方式对我不起作用? 有什么建议吗?
由于
答案 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初始化类(如上所述)。