ホームページ  >  記事  >  Java  >  Spring IOCとDIの詳細説明

Spring IOCとDIの詳細説明

Guanhui
Guanhui転載
2020-06-23 17:59:333315ブラウズ

Spring IOCとDIの詳細説明

Spring とは

Spring は、IoC と AOP を核としたフレームワークです。

IoC (Inversion of Control、制御の反転) は Spring の基盤です。

IoC は、オブジェクトを作成するときに、前のプログラマがオブジェクトの作成を Spring に任せるのではなく、新しいコンストラクター メソッドを呼び出したことを単に意味します。

DI (Dependency Inject、依存性注入) は、これら 2 つの名前が 2 つの観点から同じ概念を説明していることを除いて、IoC と同じ意味を持ちます。

簡単に言えば、DI はオブジェクトの属性であり、関連する値が注入されており、直接使用できます。

Spring IOCとDIの詳細説明

IoC による制御の反転

各オブジェクト クラスをカプセル化した後、IoC コンテナを介してこれらのオブジェクト クラスを関連付けます。このように、オブジェクトは IoC コンテナを介して接続され、オブジェクト間には直接的な接続はありません。
Spring IOCとDIの詳細説明

アプリケーションが IoC コンテナを導入する前に、オブジェクト A はオブジェクト B に依存します。その後、オブジェクト A がインスタンス化されるか、特定の時点まで実行されると、オブジェクト B をアクティブに作成するか、それを使用する必要があります。作成されたオブジェクト B は、作成されたオブジェクト B を作成するか使用するかにかかわらず、制御はアプリケーション自体にあります。

アプリケーションが Ioc コンテナを導入すると、オブジェクト A とオブジェクト B の間の直接接続が失われます。したがって、オブジェクト A がインスタンス化されて実行されるときに、オブジェクト B が必要な場合、IoC コンテナはオブジェクト B をアクティブに作成し、オブジェクト A が必要とする場所にそれを挿入します (つまり、依存関係の注入)。その結果、オブジェクト A がオブジェクト B に依存するプロセスは、能動的な動作から受動的な動作、つまり、オブジェクトの作成が IoC コンテナに渡されて処理され、制御権が逆転します。いわゆる制御の反転。

DI 依存関係の注入

IoC コンテナーは、実行時に特定の依存関係をオブジェクトに動的に注入します。たとえば、オブジェクト B をオブジェクト A のメンバー変数に注入 (代入) します。

実は、Dependency Injection (DI) と Inversion of Control (IoC) は同じものを別の記述で表現したもので、ある側面においては異なる視点から記述したものです。依存関係の注入はアプリケーションの観点から説明されます。つまり、アプリケーションは必要な外部リソースの作成と注入をコンテナに依存しますが、制御の反転はコンテナの観点から説明されます。つまり、コンテナがリソースを制御します。コンテナはアプリケーションの方向を反転し、アプリケーションが必要とする外部リソースを注入します。ここで言及する外部リソースには、外部インスタンス オブジェクト、外部ファイル オブジェクトなどが含まれます。

IoC および DI の実装

(1) プロパティ セッター メソッドの注入: セッター メソッドを使用して依存インスタンスを注入する IoC コンテナーを指します。パラメータなしのコンストラクタまたはパラメータなしの静的ファクトリメソッドを呼び出してBeanをインスタンス化し、Beanのsetterメソッドを呼び出すことで、setterメソッドによる依存性注入を実装できます。この方法はシンプルで直感的で理解しやすいため、Spring の設定インジェクションが広く使用されています。

package com.ssm.entry;

public class UserServiceImpl implements UserService {

	private UserDao userDao;
	
	// setter()实现依赖注入
	public void setUserDao(UserDao userDao){
		this.userDao = userDao;
	}
	
	public void login() {
		this.userDao.login();
		System.out.println("UserService login");
	}

}

(2) コンストラクター注入: コンストラクター メソッドを使用して依存インスタンスを注入する IoC コンテナーを指します。コンストラクターに基づく依存関係の注入は、パラメーターを指定してコンストラクターを呼び出すことによって実装されます。各パラメーターは依存関係を表します。

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    		http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
    		
    <!-- 将指定类配置给Spring,让Spring创建其对象的实例 控制反转 -->
		<bean id="UserDao" class="com.ssm.entry.UserDaoImpl"></bean>
		
		<!-- 添加一个id为userService的Bean 依赖注入-->
		<bean id="UserService" class="com.ssm.entry.UserServiceImpl">
			<!-- 将name为UserDao的Bean注入UserService实例中 -->
			<property name="UserDao" ref="UserDao"/>
		</bean>
</beans>

IoC テスト

package com.ssm.entry;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IoC {
	public static void main(String[] args) {
		
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao userDao = (UserDao)applicationContext.getBean("UserDao");
		userDao.login();
		
	}
}

DI テスト

package com.ssm.entry;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DI {
	
	public static void main(String[] args) {
		ApplicationContext applicationContext = new 
				ClassPathXmlApplicationContext("applicationContext.xml");
		UserService userService = (UserService)applicationContext.getBean("UserService");
		userService.login();
	}
	
}

推奨チュートリアル: 「Java チュートリアル #」

#

以上がSpring IOCとDIの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。