IOCの概念と分析

Jul 17, 2017 pm 01:36 PM

制御の反転 (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 アプリケーションのルート ディレクトリに対する相対パスから構成ファイルを検索してロードできるようにします。 ResourceLoaderインターフェイスの実装)。 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか? キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか? Mar 17, 2025 pm 05:43 PM

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? 高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか? 適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか? Mar 17, 2025 pm 05:45 PM

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

See all articles