AbstractModule
クラスのinstall()
メソッドは何をしますか?誰かが私にそれを説明できますか? guiceサイトから読んだドキュメントからは、次の情報しか得られませんでした。
指定されたモジュールを使用して、より多くのバインディングを構成します。
どのバインディングを正確に構成しますか?インストールされたモジュールからのバインディング、またはインストールメソッドを呼び出したクラスのバインディング?
install
は構成を可能にします:configure
メソッド内で、FooModuleは(たとえば)FooServiceModuleをインストールできます。これは、FooModuleのみに基づいて作成されたインジェクターには、FooModuleとFooServiceModuleの両方にバインディングとプロバイダーが含まれることを意味します。
読みやすさやテストを容易にするために、または依存関係が構成されていることを確認するための高レベルモジュールのために、モジュールを論理サブモジュールに分割するために使用されるinstall
が表示されます。また、異なるコンストラクターパラメーターを使用してモジュールインスタンスをインスタンス化する(複数のデータストアをバインドするなど)ために使用したり、 FactoryModuleBuilder で作成されたような自動生成モジュールインスタンスをインストールしたりすることもできます。
重複バインディングは許可されないため、モジュール構成は両刃の剣になります。FooModuleとBarModuleの両方がinstall
同じ依存モジュールであり、バインディングが 正確な重複 でない場合(例:モジュールがそのconfigure
メソッドでオブジェクトをインスタンス化した場合、重複したバインディングのために、GuiceはFooModuleとBarModuleの両方をインストールするインジェクターの作成に失敗します。この問題を回避するには、モジュールでequals
とhashCode
を定義するか、任意のモジュールがトップレベルであるか、他の1つのモジュールにインストールされるように構成を管理します(ただし、両方ではない) 。
バインディングの重複排除の詳細については、 this archived blog または this SO answer を参照してください。