用于Rpc服务的变量的GIN @Inject

时间:2012-02-20 17:33:26

标签: gwt dependency-injection guice inject gin

我在变量上使用Inject时有点迷失。

我得到了这段代码:

private XXServiceAsync xxServiceAsync;

@Inject
protected IndexViewImpl(EventBus eventBus, XXServiceAsync tableManagementServiceAsync) {
    super(eventBus, mapper);

    this.xxServiceAsync = xxServiceAsync;
    initializeWidgets();
}

使用此代码,我可以在课程中的任何地方调用我的RPC服务(点击...) 我想通过直接注入变量来清除一些代码;这样做:

@Inject
private XXServiceAsync xxServiceAsync;


protected IndexViewImpl(EventBus eventBus) {
    super(eventBus, mapper);
    initializeWidgets();
}

这始终使Service保持为NULL。 难道我做错了什么 ?具有rpc服务的GIN魔法是否意味着要以其他方式完成?

谢谢!

2 个答案:

答案 0 :(得分:5)

此时它仍为null,因为Gin(和Guice以及其他这样的框架)在构造函数完成运行之前无法分配字段。

如果您手动连接代码,请考虑这看起来如何(请记住,Gin / Guice会欺骗一些以分配私有字段,调用不可见的方法):

MyObject obj = new MyObject();//initializeWidgets() runs, too early!
obj.xxServiceAsync = GWT.create(xxService.class);

如果您需要构造函数中的某些内容,请将其传递给构造函数。如果您不需要它(例如直到调用asWidget()),那么使用@Inject注释的字段或setter可能会有所帮助。

答案 1 :(得分:0)

如果您有场级注入,则可以使用空的@Inject方法进行注入后初始化。注入无参数的方法将在完成现场注射后运行。

@Inject void initialize(){
  ...
  initializeWidgets()
}

编辑:我之前曾说过它是在方法注入后运行的,但是测试显示情况并非总是这样。