制御の反転 (IoC) はフレームワークの重要な機能であり、オブジェクト指向プログラミングの特別な用語ではありません。これは、依存関係の注入 (DI) および依存関係のルックアップとは関係ありません。
一 .IOCの概念: IOC (Inversion of Control) は、制御の反転を意味します。まず、何が反転されているかを理解する必要があります。 Java プログラムのビジネス ロジックのほとんどは、連携するために複数のオブジェクトを必要とします。通常、各オブジェクトが連携オブジェクトを使用する場合、new object() のような構文を使用して連携オブジェクトのアプリケーションを完成させる必要があります。このように、オブジェクト間の結合度は高い。 IOC の考え方は、Spring コンテナがこれらの相互依存オブジェクトの作成と調整を実装するというものです。オブジェクトはビジネス ロジック自体を考慮するだけで済みます。この点で、オブジェクトがどのように協力者を獲得するかという責任は逆転します。実際、IOC には DI (Dependency Injection) というより適切な名前があり、依存関係の注入です。
よくある例を挙げると、現在ある会社があり、その会社が対応する仕事を遂行するために従業員を必要としているとします。その場合、会社はニーズに基づいて会社で働くこの分野の人材を見つける方法を見つける必要があります。これは従来の方法であり、すべての人材がその Web サイトに自分の情報を登録し、企業が人材を必要とするときに、その Web サイトが特定の人材を提供するものとします。企業は雇用要件を公表するだけで済みます。この例の企業はビジネス クラス EnterpriseService と考えることができ、人材はビジネス クラスが作業を完了するために必要とする支援クラス Employee と見なされます。すると、採用サイトはIOCコンテナに相当します<code class="java"><span class="hljs-number"><span style="color: #000000"><br/>1 . 传统获取对象的方式<br/></span></span></code>public class EnterpriseService { Employee employee = new Employee();//自己通过new Object()方式获取对象public void service() { employee.doSomething(); } }
<code class="java"><span class="hljs-number"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-keyword"><span class="hljs-comment"><span class="hljs-function"><span class="hljs-keyword"><span class="hljs-keyword"><span class="hljs-title"><span class="hljs-params"><span class="hljs-number">2 . 使用IOC容器方式<br/></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
public class EnterpriseService { @Autowired Employee employee;//由容器完成对象的获取以及后续生命周期的管理public void service() { employee.doSomething(); } }
2. DIの原理の分析
DIの原理は非常にシンプルで、Javaのリフレクション機構に基づいて実装されています。 Spring を使用する場合、XML 構成ファイルがあり、このファイルは Bean 間の依存関係を記述するために使用されます。 IOC コンテナは、このファイルに基づいてすべての Bean を維持および管理し、Bean インスタンスのキャッシュ、ライフサイクル管理、Bean インスタンス プロキシ、イベント発行、リソースの読み込みなどの高度なタスクを提供します。
IOC は、起動時に Resource および ResourceLoader を通じてリソース ファイルの読み取りと解析を支援し、Bean の構成情報をファイルに保存し、Bean Bean のセッター メソッドをインスタンス化するときに、対応するクラス ローダーに従ってリフレクションを通じてそれを呼び出します。構成ファイルで構成されたプロパティをインスタンスに挿入して、オブジェクトの作成を完了します。
3. 関連コンテンツ
1. 注入方法の観点からは、コンストラクター注入、属性注入、インターフェイス注入の 3 つの注入方法があります。 Spring はコンストラクター インジェクションとプロパティ インジェクションをサポートしています。
BeanFactory は、Spring Framework のコア インターフェイスであるクラス ファクトリであり、BeanFactory 上に構築されたさまざまな種類の Java オブジェクトを管理できます。国際化サポートやフレームワーク イベント システムなど、よりアプリケーション指向の機能。 3.
BeanFactory を通じて IOC コンテナーを開始する場合、構成ファイルで定義された Bean はすぐには初期化されません。初期化アクションは、最初の呼び出しが行われたときに発生します。シングルトン Bean の場合、BeanFactory は Bean インスタンス (HashMap に基づいて実装) をキャッシュするため、getBeans メソッドが再度呼び出されるときに、Bean インスタンスは IOC コンテナのキャッシュから直接取得されます。 4. ApplicationContext の主な実装クラスは ClassPathXmlApplication と FileSystemXmlApplicationContext です。WebApplicationContext は ApplicationContext を継承し、Web アプリケーションのルート ディレクトリに対する相対パスから構成ファイルを検索してロードできるようにします。 ResourceLoadera3da4b6ac0c63aef374b04ddd7531aa0インターフェイスの実装)。 ServletContext 参照は WebApplicationContext から取得でき、WebApplicationContext 全体がプロパティとして ServletContext に配置されるため、Web アプリケーション環境は Spring アプリケーション コンテキストにアクセスできます。リクエスト、セッション、グローバル セッションという 3 つの Bean スコープが Web アプリケーションに追加されました。
WebApplicationContext の初期化メソッドは、ServletContext インスタンスが必要であるため、BeanFactory や ApplicationContext とは異なります。つまり、起動作業を完了するには Web コンテナーが必要です。 5 .ApplicationContext の初期化と BeanFactory の初期化の主な違いは次のとおりです。
ApplicationContext は、アプリケーション コンテキストの初期化時にすべての Bean をインスタンス化します。 もう 1 つの大きな違いは: ApplicationContext は Java リフレクション メカニズムを使用して、構成ファイルで定義された BeanPostProcessor、InstantiationAwareBeanPostProcessor、および BeanFactoryPostProcessor を自動的に識別し、それらをアプリケーション コンテキストに自動的に登録しますが、BeanFactory はコード内で手動で渡す必要があります。 addBeanPostProcessor() メソッド を登録します。 6.scope="singleton" の Bean の場合、Spring は Bean を IOC コンテナーにキャッシュし、呼び出し元に Bean 参照を返し、これらの Bean の後続のライフ管理を実行し続けます。 getBeans メソッドが呼び出されるたびに同じ Bean が返されます。scope="prototype" の Bean の場合、getBeans メソッドが呼び出されるたびに、Spring は Bean の存続期間管理を担当しなくなります。新しい Bean が返されます。
以上がIOCの概念と分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。