なぜ依存性注入のためのフレームワークが必要なのですか?[閉まっている]


42

Inversion of Controlの原則とDependency Injectionをその実装としてさらに読んでいますが、それを理解していると確信しています。

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

それがそうであるように思えるこの単純な場合、注釈を使用してこれを実装するspringやguiceのようなフレームワークが必要なのはなぜですか?ここに基本的なものがありませんか?Dependency Injectionフレームワークの使用方法を理解するのに本当に苦労しています。

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



11
コンパイル時ではなくランタイムにエラーをシフトするのに役立ちます。
デン

1
@denなぜそれをしたいのでしょうか?それは速い失敗違反しているようだ
このユーザーがHELPニーズ

回答:


26

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

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

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


8
頭に釘を打ちます。私たちはしていないそれらを必要とします。それらは、大規模なプロジェクトの作業を簡単にします。正直なところ、フレームワークは小規模なプロジェクトに値するよりも面倒です。OPは、依存性注入とそれをサポートするフレームワークを混同しないことをお勧めします。
ラバーダック

1
よく言った。そして、他の誰かがすでに素敵で丸いものをすでに作ったのに、なぜ車輪を再発明するのですか?
15年

まさにそれ。インスタンス化コードを変更する必要がないことを除いて-もちろん、インスタンス化コードはありません ;-)
Mathieu Guindon

あなたのDIライブラリがひどいようです。良いものは、リフレクションを使用してインスタンス化するクラスを推測できます。
フローリアンマーゲイン

2
ランタイム処理にリフレクションを使用している人は誰でも間違っています。リフレクションは、あなたが何かをすることができるからといって、そうすべきではないというテクノロジーの1つです。
-gbjbaanb

12
  1. なぜDI(Dependency Injection)が必要なのですか?

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

  2. どうやって?

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

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

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

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

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

    • オブジェクトを作成するタイミングを制御するのに役立ちます。アプリケーションのブートストラップ中にインスタンスを作成できますが、場合によっては、必要な場合にのみ遅延作成が優れています

    • これらは、作成されるインスタンスの数を制御するのに役立ちます。アプリケーションの有効期間ごとに1つ、またはリクエストごとに1つ(Webプログラミングを行う場合)

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


2
フレームワークをまったく使用せずにDIライブラリを使用できます。
フロリアンマーゲイン

5

春では、それは主に利便性の問題です。

あなたはクラスを持っている場合はTopLevel、クラス構成されているMiddleLevelクラスを構築しLowLevel、そしてあなたが上に新しいコンストラクタパラメータを必要と実現LowLevel、あなたもそれを追加する必要がありTopLevel、かつにMiddleLevel単にので、それは時間であるときことを、MiddleLevel構築するLowLevel値が利用できるようになりますコンストラクタに渡すことができます。春では、注釈を追加するだけです。

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

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


3
特にXMLの発言に同意します。私見、コンストラクタを恐れることは、おそらくDIフレームワークを使用する悪い理由です。
ロバートハーヴェイ

2
私見、コンストラクターを恐れることは、プログラミングから離れる正当な理由です。C-:=
マイクナキス

5
しかし、これは工場(静的またはその他)に比べてどのように利点がありますか?(これは、必要に応じて使用できるオプションであるという利点がありますが、春はまったくまたはまったく公平ではないようです)
リチャードティングル

@RichardTingle Springは、主にDI以外に行う他のすべての機能により利点を表します。これは、明らかに、静的ファクトリーである他の多くの方法でDIを達成できるためです。(もっともクールではありませんが、まだです。)しかし、質問は、DIを達成するためにスプリングを使用する必要があるかどうか、そしてそれが私が答えようとしていることです。 。
マイクナキス

これは、DIではないものの例です。´TopLevel`は作成するべきではありませんMiddleLevelTopLevel、コンストラクターへの引数として構築するときに受け取る必要があります。同様に、コンストラクタでMiddleLevelを受け取る必要がありますLowLevel
18年

1

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

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

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

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

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


4
どの具体的なクラスを使用するかを定義する方が、Javaファイル内よりもxml内の方が優れている理由について説明してください。それは私が理解したことがないことです。
リチャードティングル

1
特効薬ではありませんが、構成ファイルを使用する利点の1つは、少なくとも理論的には、コードよりも編集が簡単であることです。さらに、プログラムを実行しているがソースコードにアクセスできないユーザーが変更することができます。粗雑な依存関係注入プログラムの例では、XML構成ファイルを変更して、プログラムを作成したのにプログラムの実行方法を変更できるようにすることがありました。外部の構成可能性が必要ない場合は、コードを使用する方が簡単です。コード内のすべてのDIを行う別の仕事があり、それはうまくいきました。
ポールJアバナシー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.