Java Spring@Autowired

Java Spring@Autowired,java,spring,Java,Spring,我想我发现了一个令人困惑的问题。 我有两门课在“曹”包下 一是: 另一个是: public class SimpleMovieLister { @SuppressWarnings("SpringJavaAutowiringInspection") @Autowired private MovieFinder movieFinder; public MovieFinder getMovieFinder() { return 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”)后,将引发预期的异常。 哇,请帮帮我。 非常感谢。

如上所述

默认情况下,只要没有可用的候选bean,自动连接就会失败

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

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

到目前为止,我还没有找到一种方法,可以将自动布线配置为在有多个候选对象时失败——我想您必须创建自己的和/或覆盖

我认为最好的做法是避免有多个候选者,或者提供额外的限定符,或者避免创建不必要的候选者

但让我困惑的是,现在我们有两个类型的实例 电影发现者


如果您正在使用(
@Repository
),那么为什么要第二次用XML配置这个bean?这就是为什么您有两个相同的bean。

您说的“我们有两个类型为MovieFinder的实例”是什么意思?您希望抛出什么异常?我的意思是,现在我们有两个来自IoC的实例。一个是通过显式实例化的实例。另一个是由组件扫描机制创建的。
当遇到@Autowired时,如果有超过一名候选人,这难道不应该是一个例外吗?是什么让你认为你有两名来自国际奥委会的候选人@如果不需要,Autowired不会创建对象。一个是显式创建的,另一个是通过组件扫描机制隐式创建的。不,组件扫描不会愚蠢到创建第二个对象,然后抛出异常,因为有两个候选对象。通常,Spring将对象引用解析为单个对象,除非您指定需要多个对象,并且在满足要求的对象已经存在时不创建新对象。首先感谢您的长篇大论。但我想说的是,如果我确认了多个候选对象,则会出现错误,事实就是这样发生在我身上。我正在学习和练习。所以可能代码和配置很难看。请原谅我。
<bean class="cao.SimpleMovieLister"/>
<context:component-scan base-package="cao"/>
<bean id="1" class="cao.MovieFinder"/>