2012-02-20 5 views
3

変数の入力を使用すると少し失われます。私はクラスで必要な場所私は私のRPCサービスを呼び出すことができます。このコードでGIN @ Rpcサービスの変数の入力

private XXServiceAsync xxServiceAsync; 

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

    this.xxServiceAsync = xxServiceAsync; 
    initializeWidgets(); 
} 

、(クリックで...) 私は少しにコードをクリアしたいと思います:私はこのコードの作業を得た

変数に直接的に注入する。そうすること:

@Inject 
private XXServiceAsync xxServiceAsync; 


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

をこれは常にNULLにサービスを維持します。 何か間違っていますか? rpcサービスを利用したGINの魔法は、別の方法で行われることを意図していますか?

ありがとうございます!

答えて

5

Gin(およびGuiceなどの他のフレームワーク)は、コンストラクタの実行が完了するまでフィールドを割り当てることができないため、この時点ではまだnullです。

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

あなたが何かを必要とする場合:手動で(つまりジン/ Guiceのを覚えて、プライベートフィールドを割り当てるには少しカンニング非可視メソッドを呼び出します)コードを配線した場合

が、これがどのように見えるかを考えてみましょうコンストラクタをコンストラクタに渡します。すぐに必要がない場合(asWidget()が呼び出されるまで)、@Injectで注釈が付けられたフィールドまたはセッターが役に立ちます。

+0

コンストラクタが一度実行されると、フィールドが割り当てられることを指摘してくれてありがとう。 –

0

フィールドレベルの注入がある場合は、空の@Injectメソッドを使用して注入後の初期化を実行できます。引数のない注入メソッドは、クラスのフィールド注入が完了した後に実行されます。

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

編集:私は以前にも同様の方法注入後に実行されたと述べたが、テストは、これは必ずしもそうではないことを示しています。

+0

クラスに対して実行される注入のリストを実際に生成するコードについては、InjectionPoint.getInjectionPointsを参照してください。これは、各スーパークラスのフィールドとメソッドを注入する型階層を歩くように見えます。つまり、クラスにInjectメソッドがある場合は、クラスのInjectフィールドの後に必ず実行されます。しかし、この動作に依存することは確かに悪い習慣です。 (これはGuiceコードにありますが、Gin生成コードは類似している可能性があります) – idle

関連する問題