【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をカスタマイズできますか?
 
もちろんいいです.私たちは対応するクラスに注釈を追加する時に、注釈の後にユーザー定義のクラス名を追加する必要があります.例えば、
 
@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で注釈すればいいです.