当您使用Autowire注释标记某些内容时,您表示您希望使用此特定内容,例如要自动连接DI的类。
现在,您在何处设置要在Autowire中使用的目标类?
所以在下面这个例子中,你自动装配了setter:
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Required
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
Spring会搜索任何实现MovieFinder接口的类吗?
答案 0 :(得分:5)
春天会不会搜索任何课程 实现接口 的MovieFinder?
基本上,是的。当它找到多个时会变得很有趣,它会在上下文启动时引发异常,除非你采取措施来帮助它。
有三种方法可以解决多个autowire候选人:
autowire-candidate="false"
标记您不想要自动装配的那些。 primary="true"
@Autowired
@Qualifier("TheBeanIWant")
注释
以上任何一种都可行,你选择最适合你情况的那种。
@Qualifier("TheBeanIWant")
和@Resource(name="TheBeanIWant")
非常相似,不同之处在于@Qualifier
正在帮助Spring缩小自动装配的范围,而@Resource
则明确地选择了一个名称的bean,无论何种类型。
答案 1 :(得分:3)
如果上下文中有一个类型为MovieFinder
的bean,它将被注入。如果有多个该类型的bean,则会抛出异常。
在构造函数注入的情况下,@Autowired
(和@Required
我假设)只是按类型自动装配。
如果要使用注释明确指定名称,请使用@Resource(name="beanId")