2016-09-27 2 views
2

Guiceのモジュールへの依存性を注入しますしたがって、コネクタは明らかに正しく配線されていません。は、私はAPIトークン(簡易)を取得して保持モジュールを持っている

コンストラクタを作成してそこに@Injectを使用しようとしましたが、これらのモジュールをnew経由でアプリケーションのブートストラップクラスのリストに手動で追加しています。

明らかに私はここに何かが不足しています - おそらくちょうどnewまでTokenConnectorを上回る可能性があります。この場合、依存関係自体はないので、ここで何が起こっているのかを理解できません。ですから、(単純化された)他のコードや、このコードの簡略化された部分を見たいと思ったら、教えてください。

答えて

6

モジュールには@Injectを使用することはできませんが(強くお勧めする別のインジェクタからモジュールを入手しない限り)、@Providesメソッドに簡単に注入できます。ここ

public class KeyHolderModule extends AbstractModule { 
    private DateTime keyLastRefreshed; 
    private String key; 
    private Credentials creds = config.getCreds(); 

    @Override protected void configure() {} 

    @Provides @Named("apiKey") public String getKey(
      TokenConnector connector) { 
     // logic to check key last refreshed and handle generating a new one 
     this.key = connector.getToken(creds); 
     this.keyLastRefreshed = DateTime.now(); 

     return this.key; 
    } 
} 

トリックは、モジュールを手動インジェクターの作成時でインスタンスが通常であるということですが、@Providesの方法は、それらが提供する依存関係がを必要としているときに呼び出さです。その結果、インジェクタは、モジュールの構築時に何も提供する準備ができていませんが、アプリケーションライフサイクル全体で呼び出される@Providesメソッドは、インジェクタが提供する他の依存関係にアクセスできます。 configureが実行されているときは、インジェクタがまだ作成されていません。できるだけgetProviderを呼び出してください(ただし、インジェクタが準備完了するまでgetにコールすることはできません)。

私はthis SO answerのようなモジュール内のさまざまなインジェクション技術を書きました。

+0

また、別の方法として、キープロバイダをバインドする方法があります。キープロバイダは、注入可能で、ロジックをカプセル化し+キーを返します。それはguiceの面で@Providesを使用するのと同じですか? – pandaadb

+1

@pandaadb私がよく知らない技術的な_key-provider_という用語があるのか​​どうか分かりませんが、モジュールにとって少し重くなっていることは間違いありません。私のコードを見直してもらえれば、これをトップレベルのクラス「Provider 」やオンデマンドでキーを提供していたランダムなPOJO(これはおそらくあなたが意図したものです)に移動することを確かに考えています。 –

+0

乾杯Jeff - ええ、私は実際にこれを別の授業に移してしまいました(しかし、私が自分自身に気づいた状況が不思議でした、それは私のguiceに対する理解のギャップを反映しているようでした。 –

関連する問題