0

紛らわしい問題を見つけたと思います。パッケージ「cao」の下に2つのクラスがあります。1つは次のとおりです。

@Repository
public class MovieFinder {
}

もう1つは次のとおりです。

public class SimpleMovieLister {

    @SuppressWarnings("SpringJavaAutowiringInspection")
    @Autowired
    private MovieFinder movieFinder;

    public MovieFinder getMovieFinder() {
        return movieFinder;
    }

    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}

アプリケーションの xml ファイルでは、次のように定義します。

<bean class="cao.SimpleMovieLister"/>
<context:component-scan base-package="cao"/>
<bean id="1" class="cao.MovieFinder"/>

その後、プログラムは正常に実行できます。しかし、私を混乱させたのは、今では MovieFinder 型のインスタンスが 2 つあるということです。なぜ例外をスローしないのでしょうか?

@Repository を @Repository(value="2") に変更すると、予想される例外がスローされます。うわー、助けてください。どうもありがとう。

4

2 に答える 2

2

春のドキュメントで述べたように:

デフォルトでは、利用可能な候補 Bean がゼロの場合はいつでも自動配線が失敗します。

実際には、複数の候補を配列/コレクションに自動配線できるため、複数の候補があるかどうかはあまり気にしません。

複数の候補がある場合は常に、最後に作成された Bean が自動配線されるようですが、これをサポートするドキュメントは見つかりません。この動作に依存しないでください。

これまでのところ、候補が複数ある場合に失敗するように自動配線を構成する方法をまだ見つけていません。独自のBeanPostProcessorを作成するか、 AutowiredAnnotationBeanPostProcessorをオーバーライドする必要があると思います。

ベストプラクティスは、追加の修飾子を提供するか、不要な候補を作成しないようにして、複数の候補を持つことを避けることです。

于 2013-05-05T06:34:40.693 に答える