我想我发现了一个令人困惑的问题。 我在“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/