0

我想我发现了一个令人困惑的问题。我在包'cao'下有两个类一个是:

@Repository
public class MovieFinder {
}

另一个是:

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 类型的实例。为什么不抛出异常呢?

在我将@Repository 更改为@Repository(value="2") 后,会引发预期的异常。哇,请帮帮我。多谢。

4

2 回答 2

2

春季文档所述:

默认情况下,只要有零个候选 bean 可用,自动装配就会失败

它并不关心是否有超过 1 个候选者,因为实际上您可以将多个候选者自动连接到一个数组/集合中。

似乎每当您有多个候选人时,它都会自动装配最后创建的 bean——但我在文档中找不到任何支持这一点的东西。永远不要依赖这种行为。

到目前为止,如果有超过 1 个候选者,我还没有找到一种方法来配置自动装配失败——我想你必须创建自己的BeanPostProcessor和/或覆盖AutowiredAnnotationBeanPostProcessor

我想说最好的做法是避免有多个候选人,要么提供额外的限定符,要么避免创建不必要的候选人。

于 2013-05-05T06:34:40.693 回答
0

但让我感到困惑的是,现在我们有两个 MovieFinder 类型的实例。

如果您使用的是基于注解的配置( @Repository),那么为什么要<bean id="1" class="cao.MovieFinder"/>在 XML 中第二次配置这个 bean?这就是为什么你有两个相同的豆子。

于 2013-05-05T07:14:54.260 回答