假设我有一个程序
@Component
public interface Coach{
public String giveCoaching();
}
@Component
public TennisCoach implements Coach{
@Override
public String giveCoaching(){
return "Teaching forhand";
}
}
我有两个Demo类,在其中我以不同的方式注入了bean。两次注射有什么区别
public class AppDemo{
@AutoWired
@Qualifier("tennisCoach")
private Coach theCoach;
}
public class AppDemo{
@AutoWired
private TennisCoach tennisCoach;
}
}
答案 0 :(得分:6)
如果您的接口有多个实现,则在自动装配Bean时会遇到异常。那时,@Qualifier
将用于选择所需的实现
@Component
public interface Coach{
public String giveCoaching();
}
@Component
public TennisCoach implements Coach{
@Override
public String giveCoaching(){
return "Teaching forhand";
}
}
@Component
public CricketCoach implements Coach{
@Override
public String giveCoaching(){
return "Teaching forbat";
}
}
现在,当您像下面自动连接Coach
界面时,就会出现歧义
public class AppDemo{
@AutoWired
private Coach theCoach;
}
因此,您必须为Coach
接口提供合适的bean,如下所示。
public class AppDemo{
@AutoWired
@Qualifier("tennisCoach")
private Coach theCoach;
}
或者,您可以在任何一种实现的顶部使用@Primary
批注,这样,如果一个接口有多个实现,则默认情况下,Spring Container将选择Bean。
但是在下面的代码中,您将直接为实现创建对象,而不是为接口创建对象。
public class AppDemo{
@AutoWired
private TennisCoach tennisCoach;
}
}
答案 1 :(得分:0)
@Qualifier
批注在您的接口具有多个实现类时使用,您应该选择要在Spring上下文中作为bean注入的那个。