0

私はbean設定を持っています:

<bean id="PostLoginUpdater" class="xyz.auth.PostLoginUpdater" autowire="byType" />

public class PostLoginUpdater implements PostLoginStatePersonalizer {

    //@Qualifier("CustomerManager")
    @Inject
    //@Resource(name = "CustomerManager")      
    private CustomerManager customerManager;

    public void setCustomerManager(CustomerManager customerManager)
    {
        this.customerManager = customerManager;
    }
}

CustomerManagerを実装するBeanが2つあるため、次のエラーが発生します。

タイプ[CustomerManager]の一意のBeanが定義されていません:単一の一致するBeanが必要ですが、2が見つかりました

ご覧のとおり、いくつかの組み合わせを試しました(@Injectと@ Qualifier、@ Ressource、@ Qualifierのみ)が、このエラーメッセージは表示されません。

Spring In Depthによると、@Qualifierは@Injectと一緒に使用できます。Bean構成でautowire="byType"を定義した場合、それらを一緒に使用できませんか?

そして、私は使用しません<context:annotation-config />または<context:component-scan />

4

3 に答える 3

1

同じタイプの Bean が複数ある場合は、'@Inject' と '@Qualifier' の組み合わせを使用できるはずです。設定方法は次のとおりです-

    <bean id="PostLoginUpdater" class="xyz.auth.PostLoginUpdater" autowire="byType" />
<bean id="firstManager" class="xyz.manager.CustomerManager" autowire="byType" >
    <qualifier>first</qualifier>
</bean>
<bean id="secondManager" class="xyz.manager.CustomerManager" autowire="byType" >
    <qualifier>second</qualifier>
</bean>

上記のように「CustomerManager」タイプの 2 つの Bean がある場合、以下に示すスニペットをインジェクションに使用できます。

 public class PostLoginUpdater implements PostLoginStatePersonalizer {

    @Inject
    @Qualifier("first")
    private CustomerManager customerManager;

    public void setCustomerManager(CustomerManager customerManager)
    {
        this.customerManager = customerManager;
    }
}

また、補足として -

いずれかの Bean を別の Bean より頻繁に使用し続ける場合は、'primary' 属性を使用できます。

たとえば、上記の例で、常に「firstManager」を使用する傾向がある場合は、以下に示すようにそれをプライマリとしてマークできます。

<bean id="PostLoginUpdater" class="xyz.auth.PostLoginUpdater" autowire="byType" />
    <bean id="firstManager" class="xyz.manager.CustomerManager" autowire="byType" primary="true" >
    </bean>
    <bean id="secondManager" class="xyz.manager.CustomerManager" autowire="byType" >
        <qualifier>second</qualifier>
    </bean>

上記の構成がある場合、修飾子が使用されていない場合、次のコードは常に「firstManager」を挿入します -

public class PostLoginUpdater implements PostLoginStatePersonalizer {

    @Inject
    private CustomerManager customerManager;

    public void setCustomerManager(CustomerManager customerManager)
    {
        this.customerManager = customerManager;
    }
}
于 2012-11-02T22:01:04.523 に答える
0

型でオートワイヤーしようとして、同時に名前を指定しても意味がありません。いずれかの方法を選択してください。

于 2012-11-02T16:02:50.663 に答える
0

過去に@Injectで@Qualifierを使用しようとしても問題がありました。注意すべきことの 1 つは、その名前の 2 つの注釈があり、1 つは Spring に、もう 1 つは Java にあることです。

org.springframework.beans.factory.annotation.Qualifier
javax.inject.Qualifier

ただし、Spring フレームワークを使用する場合、推奨される使用法は、@Component または @Named [@Component("beanName")] (注釈が付けられている場合)、または<bean>定義でコンポーネントに明示的に名前を付けることです。例のようにクラス名ではなく、自動配線が Bean 名を必要とすることに注意してください (つまり、「CustomerManager」を使用しないでください)。たとえば、Sashi の例のように 2 つの Bean 定義がある場合:

<bean id="firstManager" class="xyz.manager.CustomerManager" autowire="byType" >
    <qualifier>first</qualifier>
</bean>
<bean id="secondManager" class="xyz.manager.CustomerManager" autowire="byType" >
    <qualifier>second</qualifier>
</bean>

次に、次のようにフィールドを宣言します。

@Inject
@Qualifier("firstManager") 
private CustomerManager customerManager;
于 2013-09-04T17:47:54.117 に答える