ホームページ Java &#&チュートリアル Spring 依存関係注入のいくつかの方法

Spring 依存関係注入のいくつかの方法

Feb 27, 2017 pm 03:22 PM

IoC の紹介

通常の Java 開発では、プログラマは特定のクラス内の他のクラスのメソッドに依存する必要があります。

通常、new はクラスに依存し、クラス インスタンスを呼び出すメソッドです。この種の開発の問題は、新しいクラス インスタンスを均一に管理するのが難しいことです。

Spring は依存性注入のアイデアを提案しています。つまり、依存するクラスはプログラマによってインスタンス化されませんが、Spring コンテナは新しいインスタンスを指定し、そのオブジェクトを必要とするクラスにインスタンスを注入するのに役立ちます。

依存性注入の別の用語は、「制御の反転」です。一般的な理解は、通常は新しいインスタンスを作成し、このインスタンスの制御はプログラマであるというものです。

制御の反転とは、新しいインスタンスの作業がプログラマによって行われず、Spring コンテナに渡されることを意味します。

Spring には複数の形式の依存関係注入があります。この記事では、Spring が XML を通じて IOC 構成を実行する方法のみを紹介します。

1.Set注入

これは、SpringActionがあり、クラス内でSpringDaoオブジェクトをインスタンス化する必要があると仮定します。次に、プライベートSpringDaoメンバー変数を定義して、SpringDao setメソッドを作成します。 (これが ioc のインジェクションの入り口です):

次に、 の name 属性はクラスの完全な名前を参照します。 SpringAction の public 属性 Springdao を指定するには、 タグ内に タグを作成します。 タグ内の名前は SpringAction クラスの SpringDao プロパティ名であり、ref は次の を参照します。このようにして、Spring は実際に SpringDaoImpl オブジェクトをインスタンス化します。 SpringAction の setSpringDao メソッドを SpringDao インジェクションに呼び出します:

<!--配置bean,配置后该类由spring管理--> 
<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
<!--(1)依赖注入,配置当前类中相应的属性--> 
<property name="springDao" ref="springDao"></property> 
</bean> 
<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
ログイン後にコピー

2. コンストラクターのインジェクション

この方法でのインジェクションは、パラメーターを使用したコンストラクターのインジェクションを指します。以下の例を見てください。SpringDao と 2 つのメンバー変数を作成しました。ただし、オブジェクトの set メソッドが設定されていないため、最初の注入メソッドはサポートされません。ここでの注入メソッドは、SpringAction のコンストラクターに注入することです。つまり、SpringAction オブジェクトを作成するときに、2 つのパラメーターの値を設定します。 SpringDao と User を渡す必要があります:

public class SpringAction { 
//注入对象springDao 
private SpringDao springDao; 
private User user; 

public SpringAction(SpringDao springDao,User user){ 
this.springDao = springDao; 
this.user = user; 
System.out.println("构造方法调用springDao和user"); 
} 

public void save(){ 
user.setName("卡卡"); 
springDao.save(user); 
} 
}
ログイン後にコピー

XML ファイルでは、 タグが使用されます。 ref 属性は、他の タグの name 属性も指します:

<!--配置bean,配置后该类由spring管理--> 
<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
<!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置--> 
<constructor-arg ref="springDao"></constructor-arg> 
<constructor-arg ref="user"></constructor-arg> 
</bean> 
<bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean> 
<bean name="user" class="com.bless.springdemo.vo.User"></bean>
ログイン後にコピー

コンストラクター パラメーターの不確実性を解決するには、コンストラクターによって渡される 2 つのパラメーターが同じ型であることが判明する場合があります。どちらに対応する値を割り当てるかを区別するには、いくつかの小さな処理を行う必要があります:

次のパラメータの位置であるインデックスを設定することです:

<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
<constructor-arg index="0" ref="springDao"></constructor-arg> 
<constructor-arg index="1" ref="user"></constructor-arg> 
</bean>
ログイン後にコピー

もう1つは、パラメータを設定することです。パラメータの型:

<constructor-arg type="java.lang.String" ref=""/>
ログイン後にコピー

3. 静的ファクトリのメソッド注入

名前が示すように、静的ファクトリは Spring に管理させるために必要なオブジェクトを取得するために静的ファクトリ メソッドを呼び出します。すべてのオブジェクトでは、「エンジニアリング クラス。静的メソッド ()」を通じてオブジェクトを直接取得することはできませんが、スプリング インジェクションを通じて取得できます。

package com.bless.springdemo.factory; 

import com.bless.springdemo.dao.FactoryDao; 
import com.bless.springdemo.dao.impl.FactoryDaoImpl; 
import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl; 

public class DaoFactory { 
//静态工厂 
public static final FactoryDao getStaticFactoryDaoImpl(){ 
return new StaticFacotryDaoImpl(); 
} 
}
ログイン後にコピー

ここでは、FactoryDao オブジェクトをインジェクトする必要があります。最初の注入とまったく同じに見えますが、その後の XML を見ると大きな違いがわかります:

public class SpringAction { 
//注入对象 
private FactoryDao staticFactoryDao; 

public void staticFactoryOk(){ 
staticFactoryDao.saveFactory(); 
} 
//注入对象的set方法 
public void setStaticFactoryDao(FactoryDao staticFactoryDao) { 
this.staticFactoryDao = staticFactoryDao; 
} 
}
ログイン後にコピー

Spring の IOC 設定ファイルに注目してください 指されているクラスは FactoryDao の実装クラスではありませんが、静的ファクトリ DaoFactory を指しているため、factory-method="getStaticFactoryDaoImpl" を設定してどのファクトリ メソッドを呼び出すかを指定します:

<!--配置bean,配置后该类由spring管理--> 
<bean name="springAction" class="com.bless.springdemo.action.SpringAction" > 
<!--(3)使用静态工厂的方法注入对象,对应下面的配置文件(3)--> 
<property name="staticFactoryDao" ref="staticFactoryDao"></property> 
</property> 
</bean> 
<!--(3)此处获取对象的方式是从工厂类中获取静态方法--> 
<bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>
ログイン後にコピー

4.インスタンス ファクトリのメソッド インジェクション

インスタンス ファクトリは、オブジェクト インスタンスを取得するメソッドが静的ではないことを意味するため、最初に新しいファクトリ クラスを作成してから、通常のインスタンス メソッドを呼び出す必要があります:

public class DaoFactory { 
//实例工厂 
public FactoryDao getFactoryDaoImpl(){ 
return new FactoryDaoImpl(); 
} 
}
ログイン後にコピー

その後、以下のクラス 言うことはありません。前のクラスと非常によく似ていますが、インスタンス ファクトリ クラスを通じて FactoryDao オブジェクトを作成する必要があります:

public class SpringAction { 
//注入对象 
private FactoryDao factoryDao; 

public void factoryOk(){ 
factoryDao.saveFactory(); 
} 

public void setFactoryDao(FactoryDao factoryDao) { 
this.factoryDao = factoryDao; 
} 
}
ログイン後にコピー

最後に、スプリング設定ファイルを見てください:

<!--配置bean,配置后该类由spring管理--> 
<bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
<!--(4)使用实例工厂的方法注入对象,对应下面的配置文件(4)--> 
<property name="factoryDao" ref="factoryDao"></property> 
</bean> 

<!--(4)此处获取对象的方式是从工厂类中获取实例方法--> 
<bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean> 
<bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>
ログイン後にコピー

5. まとめ

Spring 最も一般的に使用される IOC 注入方法は (1) と (2) です。

また、Spring を通じて作成されたオブジェクトはデフォルトでシングルトンであることにも注意してください。複数インスタンスのオブジェクトを作成する必要がある場合は、 タグの後に属性を追加できます:

<bean name="..." class="..." scope="prototype">
ログイン後にコピー

上記は内容全体です。この記事が皆さんのお役に立てば幸いです。皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。

Spring の依存関係注入のいくつかの方法に関連するその他の記事については、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