3

我对在变量上使用 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();
}

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

谢谢!

4

2 回答 2

5

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

考虑一下如果您手动连接代码会是什么样子(请记住,Gin/Guice 会作弊来分配私有字段,调用不可见的方法):

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

如果您在构造函数中需要某些东西,请将其传递给构造函数。如果您不会立即需要它(例如在调用 asWidget() 之前),那么使用 @Inject 注释的字段或设置器可能会有所帮助。

于 2012-02-20T17:57:57.943 回答
0

如果你有字段级别的注入,你可以使用一个空的 @Inject 方法来做你的注入后初始化。在类上的字段注入完成后,将运行无参数注入方法。

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

编辑:我之前说过它也是在方法注入之后运行的,但是测试表明情况并非总是如此。

于 2012-02-21T01:20:12.087 回答