モジュールには@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のようなモジュール内のさまざまなインジェクション技術を書きました。
また、別の方法として、キープロバイダをバインドする方法があります。キープロバイダは、注入可能で、ロジックをカプセル化し+キーを返します。それはguiceの面で@Providesを使用するのと同じですか? – pandaadb
@pandaadb私がよく知らない技術的な_key-provider_という用語があるのかどうか分かりませんが、モジュールにとって少し重くなっていることは間違いありません。私のコードを見直してもらえれば、これをトップレベルのクラス「Provider」やオンデマンドでキーを提供していたランダムなPOJO(これはおそらくあなたが意図したものです)に移動することを確かに考えています。 –
乾杯Jeff - ええ、私は実際にこれを別の授業に移してしまいました(しかし、私が自分自身に気づいた状況が不思議でした、それは私のguiceに対する理解のギャップを反映しているようでした。 –