インジェクションが発生する前に、すべてのconfigure
メソッドがすべてのバインディングを構成することに注意してください。とはいえ、いくつかのこと:Injector
プロパティを 1 つのインスタンス@Named
のコンテンツにバインドすることは非常に便利です。これを自動的に行うメソッドがあります。唯一の秘訣は、実行時にインスタンスが必要なことです。Properties
Names.bindProperties(...)
Properties
configure()
それらがすべて同時に使用できる場合は、あるモジュールでプロパティをバインドし、別のモジュールでアプリケーションをバインドすることについて心配する必要はありません。それらがすべて同じ に入る限りInjector
、Guice はそれらをすべて結合し、互いの依存関係を満足させます。
プロバイダーはさまざまなインスタンスを返すことができ、通常はそうしますが、キーを区別するのに役立たないことは間違いありません。Properties インスタンスを直接注入するのが難しすぎる場合は、代わりに軽量のファクトリを作成することを検討してください。
public class ConfigOracle {
@Inject private Properties properties;
public String getAsString(String key) { ... }
public int getAsInt(String key) { ... }
}
public class SomeConfigUser {
@Inject private ConfigOracle configOracle;
public void doStuff() {
doStuffBasedOn(configOracle.getAsString("my.properties.key"));
}
}
Binder
モジュールに a (またはその他のもの)を挿入する必要はありません。
- を実装すると
Module
、binder
が のパラメータになりますconfigure()
。必要に応じて拡張するAbstractModule
場合は、binder()
メソッドを呼び出すだけです。
- 必要に応じて、コンストラクター引数を介して依存関係をモジュールに渡すことができます。これは、モジュールが作成するバインディングを変更する唯一の方法です (私に関する限り)。
- Injector を介してモジュールを作成できない理由はありませんが、最初に Injector を用意する必要があります。
- Injector から他のインスタンスが必要な場合は、いつでもフィールド/メソッド/コンストラクターを使用して
Provider
実装を記述したり、メソッドでパラメーターを取得したりすることもできます (依存関係が自動的に入力されます)。@Inject
@Provides
全体として、私はまだ子インジェクターのアプローチを支持しています(リンクに感謝し、以前の回答を称賛してください!)。これは、「注入されたインスタンスに基づく動的バインディング」の説明に最もよく適合し、文字通り次のように単純になります。
class PropertiesModule extends AbstractModule {
Properties properties;
PropertiesModule(Properties properties) {
this.properties = properties;
}
@Override public void configure() {
Names.bindProperties(binder(), properties);
}
}
Injector oldInjector = Guice.createInjector(allYourOtherModules);
Module myModule = new PropertiesModule(oldInjector.get(Properties.class));
Injector injector = oldInjector.createChildInjector(myModule);