gpt4 book ai didi

java - Spring @Autowired 令人困惑

转载 作者:行者123 更新时间:2023-12-02 07:03:19 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com