一致するBeanが複数検出された場合、Springはどのように名前で自動ワイヤリングしますか?


106

次のようなインターフェイスがあるとします。

interface Country {}
class USA implements Country {}
class UK implements Country ()

そして、この構成xmlのスニペット:

<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>

以下で自動依存する依存関係をどのように制御できますか?英国のものをお願いします。

class Main {
    private Country country;
    @Autowired
    public void setCountry(Country country) {
        this.country = country;
    }
}

Spring 3.0.3.RELEASEを使用しています。


1つの(テスト)環境で「タイプの一意のBeanがありません...」が発生し、私の開発環境では問題なく動作したことを付け加えたいと思います。確かにクラスパスのようなものだったと思いますが、@ Qualifierを追加すると問題なく動作することがわかりました。
markthegrea

回答:


113

これは、Spring 3.0マニュアルのセクション3.9.3に記載されています。

フォールバック一致の場合、Bean名はデフォルトの修飾子値と見なされます。

つまり、デフォルトの動作は@Qualifier("country")、setterメソッドに追加した場合と同じです。


「豆の名前」と言うときは、豆を入れるフィールドの名前ですか?(つまり、この場合はcountry
基金モニカの訴訟

67

@Qualifierアノテーションを使用できます

ここから

修飾子を使用したアノテーションベースの自動配線の微調整

タイプごとの自動配線は複数の候補につながる可能性があるため、多くの場合、選択プロセスをより詳細に制御する必要があります。これを実現する1つの方法は、Springの@Qualifierアノテーションを使用することです。これにより、修飾子の値を特定の引数に関連付けて、型の一致のセットを絞り込み、各引数に対して特定のBeanが選択されるようにすることができます。最も単純なケースでは、これは単純な説明的な値になる可能性があります。

class Main {
    private Country country;
    @Autowired
    @Qualifier("country")
    public void setCountry(Country country) {
        this.country = country;
    }
}

これはUKを使用してUSA BeanにIDを追加し、米国が必要な場合はそれを使用します。


12

同じ結果を得る別の方法は、@ Valueアノテーションを使用することです。

public class Main {
     private Country country;

     @Autowired
     public void setCountry(@Value("#{country}") Country country) {
          this.country = country;
     }
}

この場合、"#{country}文字列は、という名前のBeanに評価されるSpring Expression Language(SpEL)countryです。


プロパティに基づいて注入できますか?USAまたはUKがURLからのある種のパラメーターであり、パラメーターが何であるかに基づいて2つの異なるものを注入したい場合はどうなりますか?
Kalpesh Soni、2015

6

名前で解決するもう1つのソリューション:

@Resource(name="country")

javax.annotationパッケージを使用しているため、Spring固有ではありませんが、Springがサポートしています。


1
しかし@Resource、ジグソーモジュールのために、Java 11ですぐに使用できるわけではありません
Dirk Hoffmann

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.