【JavaEEフレームの話】Spring中@Autowiredタグと@Resourceタグの違い
5184 ワード
@Autowired
Spring 2.5は@Autowired注釈を導入しています.クラスメンバー変数、方法及び構造関数を表示して、自動組立の仕事を完成します.
@Autowiredの使用によりset、get方法を除去します.
私たちはプログラムを簡素化する目的を実現したいです.
@Autowiredデフォルトではタイプ別に注入します.
@Autowired@Qualfier(「personDaoxxx」)という名前で組み立てられています.
@Autowired(required=true)は値を注入しなければなりません.nullではなく、falseにはどんな値を注入してもnullです.
atowire属性の評価は以下の通りである.
byType:タイプ別に組み立てると、属性の種類によって、容器の中にこのタイプのマッチするbeanを探します.複数が見つかったら、異常を投げます.見つけられなかったら、属性値はnullです.
byName:名称によって組み立てられ、属性の名称によって、容器の中でこの属性名と同じbeanを探してもいいです.見つけられなかったら、即ち、属性値はnullです.
コンストラクタはbyTypeと似ていますが、コンストラクタパラメータに適用されるところが違います.容器にコンストラクタのパラメータタイプと一致するビーンが見つからない場合、異常を投げます.
Autodetect:bean類の自省機構によって、constructとbyTypeのどちらを使って自動組立するかを決定します.デフォルトのコンストラクタが見つかったら、byType方式を使います.
=======================================================================================================================================================
Spring中@Autowiredタグと@Resourceラベルの違い
強く提案します.@Autowireをやめます.@Resource原因springサポート基準を使います.
SpringはJSR-250の注釈をサポートしています.
Springは自分で定義した@Autowired注釈をサポートするだけでなく、JSR-250仕様によって定義されたいくつかの注釈をサポートします.
1.@Autowired
@AutowiredはSpringで提供されていますので、導入が必要です.
Package:org.springframe ebook.beans.factory.annotations.Autowired;
byTypeだけで注入します.
2.@Resource
@ResourceデフォルトはbyNameによって自動的に注入されます.J 2 EEが提供するものです.Packageを導入する必要があります.
javax.annotations.Resource;
@Resourceには二つの重要な属性があります.nameとtype、Springは@Resourceに注解されたname属性をbeanとして解析します.
名前、type属性はbeanのタイプに解析されます.したがって、name属性を使用すると、byNameの自動注入戦略を使用して、
type属性の場合はbyTypeオートインジェクションを使用します.nameもtype属性も指定されていない場合は、反射機構でbyを使用します.
Name自動注入戦略
@Resource組立順序
(1)nameとtypeを同時に指定した場合、Spring文脈から唯一一致するbeanを見つけて組み立て、見つけられない場合は例外を投げます.
(2)nameが指定されている場合は、コンテキストから名前(id)にマッチするbeanを探して組み立て、見つけられない場合は例外を出す.
(3)typeが指定されたら、文脈からタイプマッチングの唯一のbeanを見つけて組み立てます.見つけられないか、複数が見つからないか、いずれも異常を投げます.
(4)nameが指定されておらず、typeが指定されていない場合は、自動的にbyName方式で組み立てられます.もし一致していなかったら、1つに戻します.
オリジナルのタイプにマッチします.マッチすれば自動的に組み立てられます.
@Resourceの役割は@Autowiredに相当しますが、@AutowiredはbyTypeで自動注入されます.
3.使用の違い
@Resource(name=「login Service」)
prvate LogineService logic Service;
@Autowired(required=false)@Qualfier(「login Service」)
prvate LogineService logic Service;
(1)@Autowiredと@Resourceはbeanを組み立てるために使用できます.フィールドに書いてもいいし、setter方法に書いてもいいです.
(2)@Autowiredデフォルトでは、タイプ別に組み立てられています.デフォルトでは依存対象が必要です.null値を許可するなら、そのrequired属性はfalseとして設定できます.
(3)@Resource(この注はJ 2 EEのもの)は、デフォルトのインストール名で組み立てることができます.名前はname属性で指定できます.
name属性が指定されています.コメントがフィールドに書き込まれている場合、デフォルトではフィールド名を取ってインストール名を検索します.コメントがsetterメソッドに書き込まれている場合は、デフォルトで名前を取ります.
性名で組み立てを行う.名前にマッチするbeanが見つからない場合は、タイプによって組み立てられます.ただし、name属性が一旦指す場合は注意が必要です.
必ず名称に従って組み立てるだけです.
@Resourceを使ってフィールドに注釈することを推奨します.これはsetter方法を書かなくてもいいです.そしてこの注釈はJ 2 EEに属しています.Springとの結合が減少しています.このようにコードは見栄えがいいです.
また、実践を通じて、一つの法則をまとめました.
@requiedまたは@autwiredをset方法の上に書いたら、プログラムはset方法の中に入ります.
ただし、fieldに書いてあるとset方法には入らない.
@Autowiredデフォルトでは、タイプ別に組み立てられています.@Resourceはデフォルトでは名称別に組み立てられています.名前にマッチするbeanが見つからないと、タイプ別に組み立てられます.
----------------------------------------------------
細かい問題のまとめ:
1.私たちがテストを行う時、Application ContectオブジェクトのgetBean()方法でコンポーネントを探します.以前の配置ファイルでは、<bean>タグのID属性で定義していますが、自動スキャンで注釈した後、どのようにして構築されたidが得られますか?
この場合、Springは注釈されたクラス名を付して、そのクラス名の最初の文字を小文字にして、getBean()メソッドに置く.例えば:UserBizImpl類のコンポーネントIdはuserBizImplとなり、取得時はcontext.getBenとなります.
では、注釈を使う時に、コンポーネントのIdをカスタマイズできますか?
もちろんいいです.私たちは対応するクラスに注釈を追加する時に、注釈の後にユーザー定義のクラス名を追加する必要があります.例えば、
2.構成ファイルでは、コンポーネントのスコープを設定できますが、そのデフォルト値はシングルパターンです.注釈を追加する場合、コンポーネントのスコープはどのように設定しますか?
直接にカテゴリに注釈を追加しながら、別の注釈@Scopeを使って設定できます.以下の通りです.
注を追加した対応するクラスにおいて、初期化または廃棄する方法があれば、直接に方法に注解を加えることができます.
注@Resourceと@Autowiredを使って、依存対象に名前を設定します.
以上の内容を理解すれば、spirng零配置が簡単に実現できます.
----------------------------------------------------
プロジェクト後期の開発作業は大量のbeanを定義していますが、現在は各データベースの操作にログを追加する必要がありますので、logBizを定義しました.
通常のやり方では、すべてのプロファイルを修正してproperty属性を追加する必要がありますが、現在は自動注入機構を使用しています.
baseActionに共通のログメソッドを追加し、IogBizインターフェースを残し、継承されたサブクラスactionでlogBiz属性を定義し、@Resourceで注釈すればいいです.
Spring 2.5は@Autowired注釈を導入しています.クラスメンバー変数、方法及び構造関数を表示して、自動組立の仕事を完成します.
@Autowiredの使用によりset、get方法を除去します.
私たちはプログラムを簡素化する目的を実現したいです.
@Autowiredデフォルトではタイプ別に注入します.
@Autowired@Qualfier(「personDaoxxx」)という名前で組み立てられています.
@Autowired(required=true)は値を注入しなければなりません.nullではなく、falseにはどんな値を注入してもnullです.
atowire属性の評価は以下の通りである.
byType:タイプ別に組み立てると、属性の種類によって、容器の中にこのタイプのマッチするbeanを探します.複数が見つかったら、異常を投げます.見つけられなかったら、属性値はnullです.
byName:名称によって組み立てられ、属性の名称によって、容器の中でこの属性名と同じbeanを探してもいいです.見つけられなかったら、即ち、属性値はnullです.
コンストラクタはbyTypeと似ていますが、コンストラクタパラメータに適用されるところが違います.容器にコンストラクタのパラメータタイプと一致するビーンが見つからない場合、異常を投げます.
Autodetect:bean類の自省機構によって、constructとbyTypeのどちらを使って自動組立するかを決定します.デフォルトのコンストラクタが見つかったら、byType方式を使います.
=======================================================================================================================================================
Spring中@Autowiredタグと@Resourceラベルの違い
強く提案します.@Autowireをやめます.@Resource原因springサポート基準を使います.
SpringはJSR-250の注釈をサポートしています.
Springは自分で定義した@Autowired注釈をサポートするだけでなく、JSR-250仕様によって定義されたいくつかの注釈をサポートします.
1.@Autowired
@AutowiredはSpringで提供されていますので、導入が必要です.
Package:org.springframe ebook.beans.factory.annotations.Autowired;
byTypeだけで注入します.
2.@Resource
@ResourceデフォルトはbyNameによって自動的に注入されます.J 2 EEが提供するものです.Packageを導入する必要があります.
javax.annotations.Resource;
@Resourceには二つの重要な属性があります.nameとtype、Springは@Resourceに注解されたname属性をbeanとして解析します.
名前、type属性はbeanのタイプに解析されます.したがって、name属性を使用すると、byNameの自動注入戦略を使用して、
type属性の場合はbyTypeオートインジェクションを使用します.nameもtype属性も指定されていない場合は、反射機構でbyを使用します.
Name自動注入戦略
@Resource組立順序
(1)nameとtypeを同時に指定した場合、Spring文脈から唯一一致するbeanを見つけて組み立て、見つけられない場合は例外を投げます.
(2)nameが指定されている場合は、コンテキストから名前(id)にマッチするbeanを探して組み立て、見つけられない場合は例外を出す.
(3)typeが指定されたら、文脈からタイプマッチングの唯一のbeanを見つけて組み立てます.見つけられないか、複数が見つからないか、いずれも異常を投げます.
(4)nameが指定されておらず、typeが指定されていない場合は、自動的にbyName方式で組み立てられます.もし一致していなかったら、1つに戻します.
オリジナルのタイプにマッチします.マッチすれば自動的に組み立てられます.
@Resourceの役割は@Autowiredに相当しますが、@AutowiredはbyTypeで自動注入されます.
3.使用の違い
@Resource(name=「login Service」)
prvate LogineService logic Service;
@Autowired(required=false)@Qualfier(「login Service」)
prvate LogineService logic Service;
(1)@Autowiredと@Resourceはbeanを組み立てるために使用できます.フィールドに書いてもいいし、setter方法に書いてもいいです.
(2)@Autowiredデフォルトでは、タイプ別に組み立てられています.デフォルトでは依存対象が必要です.null値を許可するなら、そのrequired属性はfalseとして設定できます.
(3)@Resource(この注はJ 2 EEのもの)は、デフォルトのインストール名で組み立てることができます.名前はname属性で指定できます.
name属性が指定されています.コメントがフィールドに書き込まれている場合、デフォルトではフィールド名を取ってインストール名を検索します.コメントがsetterメソッドに書き込まれている場合は、デフォルトで名前を取ります.
性名で組み立てを行う.名前にマッチするbeanが見つからない場合は、タイプによって組み立てられます.ただし、name属性が一旦指す場合は注意が必要です.
必ず名称に従って組み立てるだけです.
@Resourceを使ってフィールドに注釈することを推奨します.これはsetter方法を書かなくてもいいです.そしてこの注釈はJ 2 EEに属しています.Springとの結合が減少しています.このようにコードは見栄えがいいです.
また、実践を通じて、一つの法則をまとめました.
@requiedまたは@autwiredをset方法の上に書いたら、プログラムはset方法の中に入ります.
ただし、fieldに書いてあるとset方法には入らない.
@Autowiredデフォルトでは、タイプ別に組み立てられています.@Resourceはデフォルトでは名称別に組み立てられています.名前にマッチするbeanが見つからないと、タイプ別に組み立てられます.
----------------------------------------------------
細かい問題のまとめ:
1.私たちがテストを行う時、Application ContectオブジェクトのgetBean()方法でコンポーネントを探します.以前の配置ファイルでは、<bean>タグのID属性で定義していますが、自動スキャンで注釈した後、どのようにして構築されたidが得られますか?
この場合、Springは注釈されたクラス名を付して、そのクラス名の最初の文字を小文字にして、getBean()メソッドに置く.例えば:UserBizImpl類のコンポーネントIdはuserBizImplとなり、取得時はcontext.getBenとなります.
では、注釈を使う時に、コンポーネントのIdをカスタマイズできますか?
もちろんいいです.私たちは対応するクラスに注釈を追加する時に、注釈の後にユーザー定義のクラス名を追加する必要があります.例えば、
@Service("userBiz")
public class UserBizImpl implements UserBiz {
……
}
私たちはこのコンポーネントを獲得する時、context.getBeanです.2.構成ファイルでは、コンポーネントのスコープを設定できますが、そのデフォルト値はシングルパターンです.注釈を追加する場合、コンポーネントのスコープはどのように設定しますか?
直接にカテゴリに注釈を追加しながら、別の注釈@Scopeを使って設定できます.以下の通りです.
@Service("userBiz")@Scope("prototype")
public class UserBizImpl implements UserBiz {
……
}
3.コメントを使用する場合、コンポーネントの初期化と廃棄方法を設定します.注を追加した対応するクラスにおいて、初期化または廃棄する方法があれば、直接に方法に注解を加えることができます.
@PostConstruct
public void addItem() {
System.out.println(" ");
}
@PreDestroy
public void testItem() {
System.out.println(" ");
}
4.Spring自動スキャンモジュールを使った後、どのように依存注入を行いますか?注@Resourceと@Autowiredを使って、依存対象に名前を設定します.
@Resource(name="userDao")
private UserDAO userDao = null;
まず、Springという名前に基づいて自動的にスキャンし、Spring容器のセットに入れます.同じ名前があれば、注入に依存します.同じ名前がない場合は、タイプ別にコンポーネントを探します.以上の内容を理解すれば、spirng零配置が簡単に実現できます.
----------------------------------------------------
プロジェクト後期の開発作業は大量のbeanを定義していますが、現在は各データベースの操作にログを追加する必要がありますので、logBizを定義しました.
通常のやり方では、すべてのプロファイルを修正してproperty属性を追加する必要がありますが、現在は自動注入機構を使用しています.
baseActionに共通のログメソッドを追加し、IogBizインターフェースを残し、継承されたサブクラスactionでlogBiz属性を定義し、@Resourceで注釈すればいいです.