GOOD springと解釈と区別
和の区別
Difference between vs
次に例を挙げて彼らの違いを詳しく見てみましょう.
3つのclassがあります A,B,C,B,Cの対象はAに注入する.
アプリケーションContext.xmlに次の構成を追加します.
アプリケーションContext.xmlプロファイルをロードすると、次の結果が得られます.
OK、この結果は何も言うことはありません.xmlを完全に通過する方法ですが、時代遅れです.次は注釈で私たちのxmlプロファイルを簡略化します.
まず、autowireを使用して、オブジェクトbbbとcccをAに注入します.
次に、アプリケーションContext.xmlから次の構成を削除できます.
削除すると、アプリケーションContext.xmlプロファイルは次のように簡略化されます.
アプリケーションContext.xmlプロファイルをロードすると、次の結果が得られます.
OK、結果は間違っていますが、いったい何のためですか?なぜ私たちの属性は注入されなかったのでしょうか?
注釈自体は何もできないため、最も基本的な構成部分にすぎません.これらの注釈を処理できる処理ツールが必要です.
アプリケーションContext.xmlプロファイルを次のように変更します.
アプリケーションContext.xmlプロファイルをロードすると、次の結果が得られます.
OK、結果は正しかった.
以下の説明と区別:
しかし、コードを次のように変更します.
アプリケーションContext.xmlプロファイルを次のように変更します.
アプリケーションContext.xmlプロファイルをロードした後、出力がありません.なぜですか.
それは既に登録されているbeanでしか機能しないからです.
スプリングコンテナに登録されていないbeanの場合、アクションは実行されません.
ただし、
アプリケーションContext.xmlプロファイルを次のように変更します.
アプリケーションContext.xmlをロードすると、次の結果が得られます.
これは何が原因ですか?
com.xxxパッケージとそのサブパッケージのクラスをスキャンしただけでclassは Aはcom.yyyパッケージの下にあるのでスキャンできません
次にアプリケーションContext.xmlにcom.yyyも追加します.
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