私はGuiceに比較的慣れていないので、これは基本的な質問かもしれません。Guiceには明示的なバインディングを要求するオプションがあるようです。明示的なバインディングを要求することには明らかな利点がありますか?誰かが実際にこのオプションを定期的に使用していますか?
3 に答える
実際にはこのオプションを使用します。Guiceを使用するのは、アプリケーションを相互に接続するためだけであり、リクエストごとのオブジェクトの構築には使用しません。その結果、バインディングのほとんどはシングルトンスコープにあります。たとえば、ビジネスロジックと統計インターフェイスの両方が同じ永続層オブジェクトで機能するようにします。
明示的なバインディングがない場合、GuiceはJITバインディングを使用してインジェクションポイントを満たそうとします。このバインディングは「スコープなし」スコープで実行され、各インジェクションポイントに新しいオブジェクトインスタンスを提供します。それは私たちが望んでいることではほとんどなく、奇妙なランタイムエラーにつながります。明示的なバインディングを強制すると、人々はそれぞれのバインディングの範囲について考え、列挙する必要があります。
この構成を使用しなかったため、最近1時間のデバッグセッションを行いました。問題は、デフォルトでシングルトンを期待していたときに複数のインスタンスが作成されたことでした。明示的なバインディングを強制することは、それがシングルトンであるべきかどうかを考える良い思い出になります。
私もデバッグに数時間を費やしました。その理由は、具象クラスのバインディングをシングルトンスコープに追加するのを忘れたためです。常に明示的なバインディングを使用するために、Guiceがモジュールにバインドされていないクラスを注入するのをどのように防ぐのかという1つの回答を使用しました。(現在選択されているものではありません):( binder().requireExplicitBindings();
AbstractModuleのconfigureメソッド内)。