ホームページ  >  記事  >  Java  >  Spring 依存関係注入のいくつかの方法

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

高洛峰
高洛峰オリジナル
2017-02-27 15:22:061434ブラウズ

IoC の紹介

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

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

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

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

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

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

1.Set注入

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

次に、60e23eb984d18edbb092da6b8f295aba の name 属性はクラスの完全な名前を参照します。 SpringAction の public 属性 Springdao を指定するには、60e23eb984d18edbb092da6b8f295aba タグ内に 3fae3ea4a17115666873e9119ccef645 タグを作成します。 3fcb97bb666cd7884d4d3210fb47b5ef タグ内の名前は SpringAction クラスの SpringDao プロパティ名であり、ref は次の e28f79c6b83cf28d814be19374e681e1 を参照します。このようにして、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 ファイルでは、3fcb97bb666cd7884d4d3210fb47b5ef タグが使用されます。 ref 属性は、他の 60e23eb984d18edbb092da6b8f295aba タグの 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 設定ファイルに注目してください 9d0d6e555ca043d11ba0d4dff918a778 指されているクラスは 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 を通じて作成されたオブジェクトはデフォルトでシングルトンであることにも注意してください。複数インスタンスのオブジェクトを作成する必要がある場合は、60e23eb984d18edbb092da6b8f295aba タグの後に属性を追加できます:

<bean name="..." class="..." scope="prototype">

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

Spring の依存関係注入のいくつかの方法に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。


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