java - Spring @Autowired 令人困惑

标签 java spring

我想我发现了一个令人困惑的问题。 我在“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") 后,引发了预期的异常。 哇,请帮助我。 非常感谢。

最佳答案

spring documentation: 中所述

By default, the autowiring fails whenever zero candidate beans are available

它并不真正关心是否有超过 1 个候选者,因为事实上您可以将多个候选者 Autowiring 到数组/集合中。

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

到目前为止,我还没有找到一种方法来配置 Autowiring ,使其在有超过 1 个候选者时失败 - 我猜你必须创建自己的 BeanPostProcessor和/或覆盖AutowiredAnnotationBeanPostProcessor

我认为最佳实践是避免有多个候选者,要么提供额外的限定符,要么避免创建不必要的候选者。

关于java - Spring @Autowired 令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16381673/

上一篇:java - 填空

下一篇:java - java中的矩阵类

相关文章:

java - onBind() 的 Spring MVC 3 Controller 注释 - 如何?

java - 是否有用于管道和过滤器范例的开源 java/c/c++ 框架?

java - 使用Spring Batch读取以#开头的文件内容

java - 是否可以使用 RandomAccessFile 打印出 Student 对象?

java - 如何用列表数据填充微调器?

java - 如何制作具有以下签名 '(x OR y) AND z'的spring data自定义查询方法

json - 具有 Spring Data Elasticsearch 的查询生成器

java.lang.NoSuchMethodException : $Proxy205. 调度(int,my.package.beans.AdapterHeader,my.package.beans.AdapterInfo)

java - 从另一个类调用时更改 TextView 的函数不起作用

java - Spark 中的 volatile 变量