依存性注入とは何ですか
メソッドのクラスが他のクラスに依存している中で、以前のJava開発では、クラスは、新しいクラスのインスタンスに通常依存し、その後、メソッドを呼び出して、この方法が高すぎるとの結合度をテストすることは容易ではない、春の依存性注入が提案されていますすなわちないプログラマによって、思考依存クラスをインスタンス化し、私たちは、新しいインスタンスを指定して、インスタンスはオブジェクトのクラスに注入されたスプリングコンテナによって支援する必要があります。
依存性注入の方法
依存性の注入三つの方法:コンストラクタ・インジェクションは、注射と注射の注釈を設定します。
1.コンストラクタ・インジェクション
Beanインスタンスのセット、およびBeanインスタンスを確実にインスタンス化した後に使用することができるときに必要な特性を確保するために、コンストラクタ注入が得られます。
使用します。
- プロパティの設定メソッドを提供せずクラスが、参照を生成する必要のあるそのような方法の構成です。
- Beanクラスのコンフィギュレーション・ファイルに配置され、コンストラクタを設定し、<コンストラクタ、引数>コンストラクタノード構成を使用して、ノードは、4つの属性を持っています
- インデックス:0から始まるプロパティの順序指定されたインデックスを注入します。
- タイプ:この属性は、対応するタイプを指します。
- 参考文献:依存するオブジェクトへの参照。
- 値:注射はオブジェクトに依存しないが、基本的なデータタイプ、利用価値。
例1:
パブリッククラスSpringAction { //注入对象springDao プライベートSpringDao springDao。 プライベートユーザーユーザー。 公共SpringAction(SpringDao springDao、ユーザーユーザ){ this.springDao = springDao。 this.user =ユーザー; System.out.println( "构造方法调用springDao和ユーザー"); } (){保存公共ボイド user.setName( "卡卡")。 springDao.save(ユーザ)。 } }
<Bean名=「springAction」クラス=「com.bless.springdemo.action.SpringActionは」> <! -主要なクラスがコンストラクタをパラメータ化している場合(2)コンストラクタ・インジェクションを作成し、この設定を追加する必要があります- > <コンストラクタ-Argのインデックス= "0" REF = "springDao"> </コンストラクタ-Argで> <コンストラクタ-Argのインデックス=」1" REF = "ユーザー"> </コンストラクタ-Argで> </ビーン> <Bean名= "springDao"クラス= "com.bless.springdemo.dao.impl.SpringDaoImpl"> </ビーン> <Bean名= "ユーザー"クラス= "com.bless.springdemo.vo.User"> </豆>
Bean構成シーケンシャル噴射方式の属性を示す前記指標パラメータ。
例2:
時々それらはコンストラクタのパラメータ間の種類と屈折率整合アイテムとの対応関係を決定するために組み合わせて使用する必要がある、以下のコードを参照してください。
パブリックカー(文字列のブランド、文字列コープ、二重価格){ this.brand =ブランド。 this.corp = CORP。 this.price =価格。 } 公共駐車(文字列ブランド、文字列CORP、INT maxSpeed){ this.brand =ブランド; this.corp = CORP。 this.maxSpeed = maxSpeed。 }
ここでは、車が過負荷に2つのコンストラクタを持って、彼らは3つのパラメータを持っています。このような状況に鑑み、インデックス困難に構成パラメータに応じて要件を満たすために、共同利用のために次に必要<コンストラクタ、引数>タイプとインデックスの問題を解決するために
<! -コンストラクタインジェクション(対応関係を参照インデックスの種類および位置によって決定される) - > <! -対応する公開車(文字列ブランド、文字列CORP 、INT maxSpeed) コンストラクタ- > <ビーンID =「CAR3 "クラス=" com.spring.model.Car "> <コンストラクタのArg-インデックス=" 0 "タイプ=" java.lang.Stringで"値="ベンツ"> </のArg-コンストラクタ> <コンストラクタインデックス= Argの" 1 "TYPE =" java.lang.Stringで"値 =" 中国FAW "> </のArg-コンストラクタ> <コンストラクタのArg-インデックス=" 2 "タイプ=" INT "値=" 200「> </ Argで、コンストラクタです> </豆>
潜在的な構成は、パラメータの異なるタイプの曖昧数はSpringコンテナが正常に起動してもよいし、エラーメッセージを表示しない、引き起こされると同じであるため、その機能を選択して構成することができる、ランダムマッチングコンストラクタはビーンをインスタンス使用しますユーザが所望ません。したがって、我々は潜在的なエラーを避けるために特に注意しなければなりません。
2.set注入
ビーンは、注射を設定し、デフォルトのコンストラクタを必要とし、注入されるプロパティに対応するセッターを提供します。
春の最初のデフォルトコンストラクタビーンビーンインスタンスオブジェクトを呼び出し、その後、反射の仕方によって属性値セッターインジェクションメソッドを呼び出します。
豆は、注入性を使用した場合、例外がスローされます表示がパラメータコンストラクタが、あなたはパラメータなしでデフォルトコンストラクタを提供する必要が定義すると仮定しました。
例1:
com.bless.springdemo.actionパッケージ; パブリッククラスSpringAction { //噴射springDaoオブジェクト プライベートSpringDao springDaoと、 SET //方法は、注入されるオブジェクト記述する必要があり 公共ボイドsetSpringDao(SpringDao springDao){ ; this.springDao = springDao } 公共ボイドOK(){ springDao.ok(); } }
<! -豆の構成、例えばスプリング管理の構成- > <Bean名= "springAction"クラス= "com.bless.springdemo.action.SpringAction"> - (1)依存性注入、現在の設定<!クラス対応するプロパティ- > <プロパティ名= "springDao" REF = "springDao"> </ property>の </ビーン> <Bean名= "springDao"クラス=「com.bless.springdemo.dao.impl.SpringDaoImpl 「> </豆>
もはや「コンストラクタ、引数」ではなく、「プロパティ」属性を使用していません。
3.ノート注入
メモ注入は、実際にはコンストラクタ・インジェクションまたは注入セットの注釈の方法を使用します。
spring2.5は、私たちは途中で依存性注入の注釈を完了することができますベースの注釈(アノテーションベース)の構成の提供を開始しました。又は注入ラインを介してJavaコード@Resource @Autowired注釈方法で使用することができます。
@Resourceと@Autowiredは、注入の完了に頼るように来ることができましたが、それらの違いはあるが。
- @Resourceデフォルトは豆の種類が注入に従って組み立てられると一致する名前が見つからない場合にのみ、名前によって注入組み立てることです。
- あなたが名前で注射してオンにしたい場合は、の種類に応じて、デフォルトの注入アセンブリ@Autowired、@Qualifierと組み合わせて使用する必要があります。
- @Resourceアノテーションは提供し、J2EE、および@Autowiredは春によって提供されています。
例:
com.bless.springdemo.actionパッケージ; パブリッククラスSpringAction { //注射はspringDaoオブジェクト @Resource プライベートSpringDao springDaoを、 setメソッドは、オブジェクトを記述するために注入する必要がない、春が役立ちます//あなたが設定/ GET (公共無効OKを){ springDao.ok(); } }
<コンテキスト:注釈-のconfig />
<Bean名= "springAction"クラス= "com.bless.springdemo.action.SpringAction"> < -名前に応じてプロパティを設定する必要はありません、@リソースのデフォルトの注入アセンブリ! - > </豆> <Bean名= "springDao"クラス= "com.bless.springdemo.dao.impl.SpringDaoImpl"> </豆>
<コンテキスト:アノテーションのconfig />効果注釈です。
同じように@Autowiredが、デフォルトの注入アセンブリの種類に応じインチ
彼は加えました:
@Autowiredは、フィールド、メソッドとコンストラクタに注釈を付けることができます。そして、メンバ変数とコンストラクタのコメント、それはどのような違いを生むのでしょうか?
まず、次のコードを見てみましょう。
@Autowired プライベートユーザーユーザー。 プライベート文字列の学校。 パブリックUserAccountServiceImpl(){ this.school = user.getSchool()。 }
コードの実行は、Javaクラスのコンストラクタは、最初の実行されるため、エラーとなり、その後、ユーザ注釈注入を@Autowired値を与える構成方法の実装におけるように、エラーになります。
次のように解決策は、コンストラクタ・インジェクションを使用することです。
プライベートユーザーユーザー。 プライベート文字列の学校。 @Autowired 公共UserAccountServiceImpl(ユーザユーザ){ this.user =ユーザー。 this.school = user.getSchool()。 }