使用@Qualifier批注和在Spring中直接注入bean有什么区别?

时间:2018-11-02 06:48:45

标签: java spring

假设我有一个程序

@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;
  }
}

2 个答案:

答案 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注入的那个。