web-dev-qa-db-ja.com

guice AbstractModuleのインストール方法

AbstractModuleクラスのinstall()メソッドは何をしますか?誰かが私にそれを説明できますか? guiceサイトから読んだドキュメントからは、次の情報しか得られませんでした。

指定されたモジュールを使用して、より多くのバインディングを構成します。

どのバインディングを正確に構成しますか?インストールされたモジュールからのバインディング、またはインストールメソッドを呼び出したクラスのバインディング?

35
MykelXIII

installは構成を可能にします:configureメソッド内で、FooModuleは(たとえば)FooServiceModuleをインストールできます。これは、FooModuleのみに基づいて作成されたインジェクターには、FooModuleとFooServiceModuleの両方にバインディングとプロバイダーが含まれることを意味します。

読みやすさやテストを容易にするために、または依存関係が構成されていることを確認するための高レベルモジュールのために、モジュールを論理サブモジュールに分割するために使用されるinstallが表示されます。また、異なるコンストラクターパラメーターを使用してモジュールインスタンスをインスタンス化する(複数のデータストアをバインドするなど)ために使用したり、 FactoryModuleBuilder で作成されたような自動生成モジュールインスタンスをインストールしたりすることもできます。

重複バインディングは許可されないため、モジュール構成は両刃の剣になります。FooModuleとBarModuleの両方がinstall同じ依存モジュールであり、バインディングが 正確な重複 でない場合(例:モジュールがそのconfigureメソッドでオブジェクトをインスタンス化した場合、重複したバインディングのために、GuiceはFooModuleとBarModuleの両方をインストールするインジェクターの作成に失敗します。この問題を回避するには、モジュールでequalshashCodeを定義するか、任意のモジュールがトップレベルであるか、他の1つのモジュールにインストールされるように構成を管理します(ただし、両方ではない) 。

バインディングの重複排除の詳細については、 this archived blog または this SO answer を参照してください。

43
Jeff Bowman