【まとめ】<br>vs


Spring mvc 3の中のはどういう違いがありますか?普段は混用していますか?今日はいいクイズを見ました。説明がとても上手です。
原文の住所は以下の通りです。
http://stackoverflow.com/questions/7414794/difference-between-contextannotation-config-vs-contextcomponent-scan
<context:annotationn config>は使用するものです。
既にspringプロファイルaplication Contaction Contact.xmlに登録されているbeanをアクティブにします(このbeanはxmlで定義されているか、スキャンパケットに含まれているかに関わらず)。
<context:component-scan><context:annotationn-config>でできること以外に、も見つけられます。
appication Contact.xmlに配置されているbeanを登録します。
抽象的で、活性化と登録の具体的な概念と違いは何ですか?いくつかの例を用いて、その中の同じ点と異なる点を説明する。
今はbean、A、B、Cが三つあります。クラスAには、bean Bとbean Cも注入されています。

package com.xxx;
public class B {
  public B() {
    System.out.println("creating bean B: " + this);
  }
}

package com.xxx;
public class C {
  public C() {
    System.out.println("creating bean C: " + this);
  }
}

package com.yyy;
import com.xxx.B;
import com.xxx.C;
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc; 
  }
}
XMLでは以下のように構成されています。

<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A">
  <property name="bbb" ref="bBean" />
  <property name="ccc" ref="cBean" />
</bean>
プロジェクトを起動したら以下のように出力します。

creating bean B: com.xxx.B@c2ff5
creating bean C: com.xxx.C@1e8a1f6
creating bean A: com.yyy.A@1e152c5
setting A.bbb with com.xxx.B@c2ff5
setting A.ccc with com.xxx.C@1e8a1f6
これは私達が欲しい結果ですが、この方式は古いので、次はコメントで上記のxml構成を代用します。
まず、クラスAでは、@Autowiredラベルを入れて、属性bbとcccを注入します。以下のとおりです
package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import com.xxx.B;
import com.xxx.C;
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  @Autowired
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  @Autowired
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc;
  }
}
これでいいです。
xmlのbean Aのpropertyを削除しました。

<property name="bbb" ref="bBean" />
<property name="ccc" ref="cBean" />
したがって、xmlは以下のように簡単にすることができます。

<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A" />
修正後の項目を起動したら、以下のように出力されます。

creating bean B: com.xxx.B@5e5a50
creating bean C: com.xxx.C@54a328
creating bean A: com.yyy.A@a3d4cf
私たちが予想していたのと違って、中には間違いがありましたか?
注釈は確かに便利な技術ですが、まだ効果が発揮されていません。彼らは実行されるタスクのように、良いツールがそれらを見つけて、それらを本当に起動させる必要があります。
ラベルは注釈を救うために派遣されます。この話はどう言いますか?このラベルはappication Contectで定義されたbeanの注釈を見つけることができます。
これにより、xmlを:

<context:annotation-config />
<bean id="bBean" class="com.xxx.B" />
<bean id="cBean" class="com.xxx.C" />
<bean id="aBean" class="com.yyy.A" />
プロジェクトを再開しました。結果は予想通りです。

creating bean B: com.xxx.B@15663a2
creating bean C: com.xxx.C@cd5f8b
creating bean A: com.yyy.A@157aa53
setting A.bbb with com.xxx.B@15663a2
setting A.ccc with com.xxx.C@cd5f8b
二つ目の案はよさそうですが、二つの行のxmlを削除しながら、もう一つの行を追加しなければなりません。大きな変化ではなさそうです。注の思想はxmlの配置を削除する必要があります。次に、beanを定義するxmlを注釈で代替する。

package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class B {
  public B() {
    System.out.println("creating bean B: " + this);
  }
}

package com.xxx;
import org.springframework.stereotype.Component;
@Component
public class C {
  public C() {
    System.out.println("creating bean C: " + this);
  }
}

package com.yyy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.xxx.B;
import com.xxx.C;
@Component
public class A { 
  private B bbb;
  private C ccc;
  public A() {
    System.out.println("creating bean A: " + this);
  }
  @Autowired
  public void setBbb(B bbb) {
    System.out.println("setting A.bbb with " + bbb);
    this.bbb = bbb;
  }
  @Autowired
  public void setCcc(C ccc) {
    System.out.println("setting A.ccc with " + ccc);
    this.ccc = ccc;
  }
}
これでxmlは残ります。
<context:annotation-config />
プロジェクトを起動して、出力結果を見てみます。結果は空白です。出力はありません。これは、beanがラベルatowiredによってアクティブにされていないという意味で、このような結果は予想外である。
文章が最初に言及したように、ラベルの作用対象権はすでにappication Contectで定義されているbeanです。私たちは三つの定義のbeanのxml文を削除した後、ラベルが見つからなくなりました。
しかし、この問題はラベルには存在しません。ラベルは指定されたjavaパッケージをスキャンして、「目標」を見つけます。(beanはxmlで定義されていなくても大丈夫です)
xmlの構成を以下のように修正します。
<context:component-scan base-package="com.xxx" />
プロジェクトを起動し、次のような出力を得ました。
creating bean B: com.xxx.B@1be0f0a
creating bean C: com.xxx.C@80d1ff
Aタイプのロードが足りないようですが、なぜですか?
これらの種類をよく観察すると、クラスAのjavaカバンはcomp.yyであり、タグに定義されているcomp.xxxではないことが分かります。だから、これはなぜA類全体のロードを見逃したのですか?
このバグを修理するために、私達はbase-packageを下記のように修正しました。
<context:component-scan base-package="com.xxx,com.yyy" />
マジックのように、予想される結果が得られた。
creating bean B: com.xxx.B@cd5f8b
creating bean C: com.xxx.C@15ac3c9
creating bean A: com.yyy.A@ec4a87
setting A.bbb with com.xxx.B@cd5f8b
setting A.ccc with com.xxx.C@15ac3c9
これで、コメントのスタイルにあったコードが完成しました。
余談ですが、base-packageをあくまでcomp.xxxと定義したら、クラスAへのロードができますか?それはbean Aを定義しなければならない。

<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />
このように定義すれば、私達は依然として正しい結果を得ることができます。
creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87
クラスAはスキャンされたjavaパッケージに含まれていませんが、タグはまだappication Contact.xmlで定義されている他のすべてのbeanを見つけます。
では、私たちが一つのxmlにタグを同時に配置すると、何が発生しますか?以下の構成はクラスAに重複してロードされますか?
<context:annotation-config />
<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />
答えはどうですか?私達が得た結果は依然として以下の通りです。
creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@1d64c37
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87
これは二つのラベルが同時に存在する場合、タグが無視されるからです。
何度も同じbeanを定義すると、Springはいつも一回だけローディングされることを確認できます。
<context:annotation-config />
<context:component-scan base-package="com.xxx" />
<bean id="aBean" class="com.yyy.A" />
<bean id="bla" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla1" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla2" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<bean id="bla3" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
結果は同じです。
creating bean B: com.xxx.B@157aa53
creating bean C: com.xxx.C@ec4a87
creating bean A: com.yyy.A@25d2b2
setting A.bbb with com.xxx.B@157aa53
setting A.ccc with com.xxx.C@ec4a87