Spring Frameworkを学んだ人は誰でも、Springの2つの概念を聞いたことがあるに違いありません。IOC(コントロール反転)とDI(依存関係注入)です。春が初めての人にとっては、IOCとDIの概念は曖昧で理解が困難であると常に感じています。今日は、Spring Framework IOCについてのオンライン技術専門家の理解のいくつかを共有し、Spring IOCの私の理解について話します。
IOCとは何ですか
コントロール、つまり「制御反転」は技術ではなく、デザインのアイデアです。 Java開発では、IOCは、オブジェクト内で直接制御するのではなく、コンテナによって制御されるように設計されたオブジェクトを提供することを意味します。
春の中核であるIOCは、ずっと走ります。 Springフレームワークでは、Springはオブジェクトのライフサイクルとオブジェクト間の関係を制御する責任があります。これはどういう意味ですか?簡単な例を挙げると、ガールフレンドを見つけるにはどうすればよいですか?よくある状況は、私たちが美しく見える女性がいる場所を見に行き、それから彼らの興味、QQ番号、電話番号、IP番号、IQ番号について尋ねることです。同じことが従来のプログラム開発にも当てはまります。オブジェクトでは、別のオブジェクトを使用する場合は、それを取得する必要があります(自分で新しいオブジェクト、またはJNDIからクエリをする)。使用後、オブジェクトを破壊する必要があり(接続など)、オブジェクトは常に他のインターフェイスまたはクラスと組み合わされます。
IOCを理解する方法は? IOCを理解するための鍵は、「誰が誰が、誰がコントロールするのか、なぜ逆転するのか(正のものがあるはずです)、逆転のどの側面があるのか」を明確にすることです。詳細に分析しましょう。
●誰が誰と何を制御するか:従来のJavaseプログラミングデザイン、オブジェクト内の新しいを介して直接オブジェクトを作成し、プログラムは従属オブジェクトを積極的に作成します。 IOCにはこれらのオブジェクトを作成するための特別なコンテナがありますが、IOCコンテナはオブジェクトの作成を制御します。誰が誰を制御しますか?もちろん、IOCコンテナはオブジェクトを制御します。何を制御しますか?つまり、主に外部リソースの取得(ファイルなどを含むオブジェクトだけでなく)を制御します。
●なぜ反転するのですか?どの側面が反転するのか:正の回転があります。従来のアプリケーションは、オブジェクト内で自分で積極的に制御され、従属オブジェクト、つまり正の回転を直接取得します。反転は、従属オブジェクトの作成と注入に役立つコンテナです。なぜ反転なのですか?コンテナは、従属オブジェクトを見つけて注入するのに役立つため、オブジェクトは従属オブジェクトのみを受動的に受け入れるため、反転です。反転はどのような側面ですか?従属オブジェクトの取得が逆転します。
伝説を使用して、従来のプログラミングが図1-1に示されていることを説明しましょう。これは、関連するオブジェクトを積極的に作成し、それらを組み合わせます。
図1-1従来のアプリケーションの概略図
IOC/DIコンテナがある場合、図1-2に示すように、これらのオブジェクトはクライアントクラスでアクティブに作成されなくなりました。
図1-2 IOC/DIコンテナの後のプログラム構造の概略図IOC/DIコンテナがあります
1.1.2 IOCは何ができますか
IOCはテクノロジーではなく、単なる考えであり、オブジェクト指向プログラミングの重要なルールであり、ゆるく結合したより良いプログラムを設計する方法を導くことができます。従来のアプリケーションはすべて、クラス内で当社によって積極的に作成されており、クラス間の高い結合とテストが困難になります。 IOCコンテナを使用すると、従属オブジェクトの作成と検索の制御がコンテナに引き渡され、コンテナが組み合わせたオブジェクトを注入するため、オブジェクトはゆるく結合されます。これは、テストにも便利で機能的な再利用が促進され、さらに重要なことに、プログラムのアーキテクチャ全体が非常に柔軟になります。
実際、IOCによってプログラミングにもたらされた最大の変化は、コードからではなく、イデオロギーの観点からのものであり、「マスター奴隷転置」の変更です。アプリケーションはもともとボスであり、彼はリソースを取得するためにイニシアチブを取りました。しかし、IOC/DIのアイデアでは、アプリケーションは受動的になり、IOCコンテナが必要なリソースを作成して注入するのを受動的に待っていました。
IOCは、オブジェクト指向のデザインのルールの1つをよく反映しています - ハリウッドのルール:「私たちを探してはいけません、私たちはあなたを探してください」。つまり、IOCコンテナは、オブジェクトが積極的に探しているのではなく、対応する依存性オブジェクトを見つけて注入するのに役立ちます。
1.1.3 IOCおよびDI
di依存性指示、つまり「依存関係注入」:コンポーネント間の依存関係は、実行時間中にコンテナによって決定されます。比fig的には、コンテナはコンポーネントに特定の依存関係を動的に注入します。依存噴射の目的は、ソフトウェアシステムにより多くの機能をもたらすことではなく、コンポーネントの再利用の頻度を増やし、システム用の柔軟でスケーラブルなプラットフォームを構築することです。依存関係噴射メカニズムを通じて、特定のリソースがどこから来て、誰がそれらを実装するのかを気にすることなく、単純な構成を通じて独自のビジネスロジックを完了するためにコードなしでターゲットが必要とするリソースを指定する必要があります。
IOCの重要なポイントの1つは、システム操作中に必要な他のオブジェクトをオブジェクトに動的に提供することです。これは、DI(依存噴射)によって達成されます。たとえば、オブジェクトAはデータベースを操作する必要があります。過去には、接続オブジェクトを取得するために常にAでコードを書きました。春には、Aで接続が必要であることをSpringだけに伝える必要があります。この接続を構築する方法とそれを作成するタイミングについては、知る必要はありません。システムが実行されているとき、Springは適切なタイミングで接続を作成し、それを注入のように注入し、各オブジェクト間の関係の制御を完了します。 aは正常に実行するために接続に依存する必要があり、この接続は春ごとに注入され、依存関係注入の名前はこれに由来します。では、DIはどのように実装されていますか? Java 1.3の後の重要な機能は反射です。これにより、プログラムはオブジェクトを動的に生成し、オブジェクトメソッドを実行し、実行時にオブジェクトのプロパティを変更できます。春は反射によって注入されます。
DIを理解するための鍵は、「誰が誰に依存しているのか、なぜあなたはそれに依存する必要があるのか、誰が誰に注入するのか、何がそれを注入するのか」です。詳細に分析しましょう。
●誰が誰に依存するか:もちろん、アプリケーションはIOCコンテナに依存します。
●依存関係が必要な理由:アプリケーションは、オブジェクトに必要な外部リソースを提供するためにIOCコンテナが必要です。
●誰が誰を注入するか:IOCコンテナがアプリケーションのオブジェクト、アプリケーションが依存するオブジェクトを注入することは明らかです。
●注入されたもの:オブジェクトに必要な外部リソース(オブジェクト、リソース、一定のデータを含む)を注入することです。
IOCとDIの関係は何ですか?実際、それらは同じ概念とは異なる角度から説明されています。制御の反転の概念は比較的曖昧であるため(コンテナ制御オブジェクトのレベルとして理解されるかもしれませんが、誰がオブジェクトの関係を維持するかを考えることは困難です)、2004年、マスターマーティンファウラーは新しい名前を付けました:「依存関係注入」。 IOCと比較して、「依存関係注入」は「注入されたオブジェクトはIOCコンテナ構成依存性オブジェクトに依存する」を明確に説明しています。
要約します
実際、誰もがSpring IOCの概念を自分で理解しており、標準的な答えはありません。一般的な方向はちょうどいいです。
上記は、春の依存関係の注入と制御の反転を理解することです。私はそれが誰にでも役立つことを願っています。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!