web-dev-qa-db-ja.com

なぜ依存性注入のためのフレームワークが必要なのですか?

私はそれの実装として、制御の逆転原理と依存性注入についてさらに読んでいて、私はそれを理解していると確信しています。

基本的に「クラス内でクラスメンバーのインスタンス化を宣言しないでください」と言っているようです。むしろ、インスタンス化はコンストラクタを通じて渡され、割り当てられる必要があります。外部ソースからクラスに「注入」されます。

これがシンプルであると思われる場合、なぜこれを注釈付きで実装するSpringまたはGuiceのようなフレームワークが必要なのでしょうか。ここに根本的なものが欠けていますか? Dependency Injectionフレームワークの使用法を理解するのに本当に苦労しています。

編集:可能性のある重複については、Springだけでなく、DIフレームワーク全般について質問しているため、私の質問はよりユニークだと思います。 Springは単なるDIフレームワークではないので、誰かがDIに関係のないSpringを使いたいと思う理由はたくさんあります。

43
timsworth

フレームワークは必要ありません。比較的大規模なプロジェクトであっても、依存性注入を手動で実装することは完全に可能です。

一方、フレームワークを使用すると、特にアノテーションまたは依存関係の自動検出に基づいたフレームワークを使用すると、プロセスが簡単になるため、簡単になります。クラスに新しい依存関係が必要であると判断した場合、追加する必要があるのはそれをコンストラクターに(またはセッターを宣言して)オブジェクトを挿入します。インスタンス化コードを変更する必要はありません。

また、フレームワークには他の便利な機能が含まれていることがよくあります。たとえば、Springには、宣言型トランザクション境界(非常に便利)や、多くのサードパーティライブラリの統合を容易にするさまざまなアダプタ実装など、アスペクト指向プログラミングに役立つフレームワークが含まれています。

26
Jules
  1. なぜDI(依存性注入)が必要なのですか?

    DIメカニズムは、オブジェクトの生成とオブジェクトの消費を分離します。オブジェクトが必要とする依存関係は、外部から透過的に提供されます。このメカニズムの利点は明らかです。たとえば、依存関係をいつでも交換できます。テストのために Null Object を使用します。

  2. それはどのように行われますか?

    目標を達成するにはいくつかの方法があります。

    • コンストラクター注入による依存関係の注入
    • ゲッター/セッターによる注入
    • インターフェース注入
  3. DIフレームワークは必要ですか?

    いいえ、まったく違います。すべてのインスタンスを他のオブジェクトに手動で渡すだけで済みます。小さなアプリケーションの場合は、スプリングコンテナーは必要ありません。

    しかし一方で、フレームワークはオブジェクトを管理する手助けをします。

    • これらは、複雑なオブジェクトの関係を関連付けるのに役立ちます。インスタンスを生成して適切なオブジェクトに渡すために、ボイラープレートコードを記述する必要はありません

    • whenオブジェクトが作成されるのを制御するのに役立ちます:アプリケーションのブートストラップ中にインスタンスを作成することもできますが、場合によっては、必要な場合にのみ、遅延作成を行う方がよい場合があります。

    • いくつインスタンスが作成されるかを制御するのに役立ちます:アプリケーションの有効期間ごとに1つ、またはリクエストごとに1つ(Webプログラミングを実行している場合)

プロジェクトに適切なサイズがある場合-ボイラープレートコードを少なく書く必要があると感じた場合-(DI-)フレームワークを使用することは完全に理にかなっています。短所よりも長所があります。

12
Thomas Junk

春は、ほとんどが便利です。

クラスTopLevelを構築するクラスMiddleLevelがあり、クラスLowLevelを構築するクラスLowLevelに新しいコンストラクターパラメーターが必要であることに気付いた場合、また、それをTopLevelMiddleLevelに追加します。これにより、MiddleLevelLowLevelを構築するときが来たときに、値が利用できるようになります。コンストラクタに渡すことができます。 Springでは、注釈を追加するだけです。

また、Springを使用すると、xmlではなく外部構成ファイルで依存関係を定義できます。これにより、「コードを変更せずに」まったく異なる配線で新しいシステムを生成できるようになります。 (XMLを変更することはコードを変更することとそれほど変わらないため、IMHOこれは完全に誤った方向に向けられています。実際、通常、コードはxmlよりもはるかに優れたエラーチェックと型チェックを備えています。)

もう1つは、多くの人がコンストラクターを恐れているということです。彼らはそれらを理解していない、彼らは彼らを好きではない、彼らはむしろそれらを使用したくない。

5
Mike Nakis

数年前、以前働いていた会社で、Webページ、Webポートレット、さらには特定のデータベーステーブルを監視するプログラムを作成しました。ユーザーがどのモニターを実行し、どのパラメーター(URL、ログイン、成功基準など)で実行できるかを十分に柔軟にできるようにしたかったのです。そこで、XMLファイルから読み取り、Javaリフレクションを使用して指定されたクラスをインスタンス化し、セッターメソッドを使用して指定されたパラメーターを設定するように記述しました。

後で私は、Springがあなたのために同じことをすることを発見しました。

だから私の場合、私はそれを見つけました

  1. 依存性注入フレームワークを使用すると、プログラムが柔軟になり、動作方法の指定が容易になります(もちろん、明確に定義されたパラメーター内で)。

  2. サードパーティのDIフレームワークを使用すると、ホイールを再発明する必要がなくなります。

1