2016-07-05 15 views
0

私は春の注釈に関連する質問があります。私の(学習)プロジェクトでは、2つのクラスと、これらのタイプのそれぞれの2つのプロパティを持つ別のクラスを定義しました。 エラーを生成するために、XML内に同じクラス型の2つのBeanを定義していますが、Setterメソッドで@Autowiredアノテーションを使用しています。このような何か:メインクラスで春の注釈名前で

<bean id="classA" class="beans.ClassA"></bean> 
<bean id="otherclassA" class="beans.ClassA"></bean> 
<bean id="classB" class="beans.ClassB"></bean> 
public class UpperClass{ 
    private ClassA classA; 
    private ClassB classB; 

    @Autowired 
    public void setClassA(ClassA classA){this.classA = classA} 
    @Autowired 
    public void setClassB(ClassB classB){this.classB = classB} 

    /* . 
     . 
     . 
    */ 
} 

、私はこのBeanののApplicationContextのインスタンスを取得し、toStringメソッド、簡単なテストをオーバーライドプロパティの内容を印刷します。 私はSpring Autowiredアノテーションが型別にBeanを探すので、ClassAクラスのBeanが2つ定義されているため、テストは失敗するはずですが、機能します。 @Resourceアノテーションを使用しても、名前は使用されません。

私はSpringバージョン4を使用しています。 私はbeanのidをclass/settersの名前と一致しないように変更しましたが、期待通りに失敗します。

誰かが私になぜ、または私が間違っているのか教えてもらえますか? beanがByTypeを見つけられない場合、SpringがbyNameを参照していますか?

+0

xmlの最初のBeanのIDを変更して、何が起こるかを確認してください。 – Jason

+0

私は、Bean IDの代わりにクラスを変更すると、エラーを得るためにsetterパラメータの名前を変更するだけでなく、setterメソッド名もBean IDと一致しないように変更する必要があることがわかりました。 – jgonzal

答えて

0

Springは、目的の型と一致する複数のBeanがある場合、あいまいさを解決するためにメソッドのパラメータ名を調べます。 IMOはあまりにも魔法的で、もう一つの理由は避けるべきです@Autowired。この動作を使用して終了する場合、IntelliJのSpringプラグインは、実際にオートワイヤリングサイトでどのBeanが実際に注入されるかを把握するのに非常に有効です。

+0

'@ Autowired'の代替案は何ですか?もちろん、XML設定は – Andreas

+0

です。クラリティは、簡潔さよりも優先されます。 –

+0

@アンドレアス曖昧さを解消するために@修飾子を使用することができます – hellojava