GOOD springと解釈と区別

121554 ワード

和の区別
Difference between vs
   springコンテナに登録されているbean(xmlでもpackage sanningでも)の上の注釈をアクティブにするための注釈処理ツールです. 指定されたpackageの下でjavabeanをスキャンおよび登録することもできる .
 
次に例を挙げて彼らの違いを詳しく見てみましょう.
3つのclassがあります  A,B,C,B,Cの対象はAに注入する.
 
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; 
  }
}

 
 
アプリケーションContext.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>

 
アプリケーションContext.xmlプロファイルをロードすると、次の結果が得られます.
 
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

 
OK、この結果は何も言うことはありません.xmlを完全に通過する方法ですが、時代遅れです.次は注釈で私たちのxmlプロファイルを簡略化します.
まず、autowireを使用して、オブジェクトbbbとcccをAに注入します.
 
 
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;
  }
}
 
 
 
次に、アプリケーションContext.xmlから次の構成を削除できます.
 
<property name="bbb" ref="bBean"/>
<property name="ccc" ref="cBean"/>

 
削除すると、アプリケーションContext.xmlプロファイルは次のように簡略化されます.
 
<bean id="bBean"class="com.xxx.B"/>
<bean id="cBean"class="com.xxx.C"/>
<bean id="aBean"class="com.yyy.A"/>

 
アプリケーションContext.xmlプロファイルをロードすると、次の結果が得られます.
 
creating bean B: com.xxx.B@5e5a50
creating bean C: com.xxx.C@54a328
creating bean A: com.yyy.A@a3d4cf

 
OK、結果は間違っていますが、いったい何のためですか?なぜ私たちの属性は注入されなかったのでしょうか?
注釈自体は何もできないため、最も基本的な構成部分にすぎません.これらの注釈を処理できる処理ツールが必要です.  やったこと
アプリケーションContext.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"/>

 
アプリケーションContext.xmlプロファイルをロードすると、次の結果が得られます.
 
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

 
OK、結果は正しかった.
以下の説明と区別:
しかし、コードを次のように変更します.
 
 
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;
  }
}
 
 
 
 
アプリケーションContext.xmlプロファイルを次のように変更します.
 
<context:annotation-config />

 
アプリケーションContext.xmlプロファイルをロードした後、出力がありません.なぜですか.
それは既に登録されているbeanでしか機能しないからです.
スプリングコンテナに登録されていないbeanの場合、アクションは実行されません.
ただし、 の機能に加えて、@component,@service,@Repositoryなどの注釈付きオブジェクトをspringコンテナに自動的に登録する機能もあります.
アプリケーションContext.xmlプロファイルを次のように変更します.
 
<context:component-scan base-package="com.xxx"/>

 
アプリケーションContext.xmlをロードすると、次の結果が得られます.
 
creating bean B: com.xxx.B@1be0f0a
creating bean C: com.xxx.C@80d1ff

 
これは何が原因ですか?
com.xxxパッケージとそのサブパッケージのクラスをスキャンしただけでclassは Aはcom.yyyパッケージの下にあるのでスキャンできません
次にアプリケーションContext.xmlにcom.yyyも追加します.
 
<context:component-scan base-package="com.xxx"/>

<context:component-scan base-package="com.xxx,com.yyy"/>
    applicationContext.xml         :
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

 

, !

applicationContext.xml , :

 

<context:component-scan base-package="com.xxx"/>

<context:component-scan base-package="com.xxx,com.yyy"/>

 

 

applicationContext.xml , applicationContext.xml A , , component-scan B,C

 

<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

 

class  A ,   された を するプロセッサツールは、xml で してもscanningスキャンで しても、コンテナにバインドされたbeanをすべて します.
では、もし たちが の で?コンテナに されているbeanに されている を する を えています. を り すことはありませんか?
 

<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

 
なぜなら   , 。 @autowire,@resource
のプロセッサを で しても、springは1 しか されません.
 









 
 
は しいです.
 
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