Допустим, у меня есть программа
@Component
public interface Coach{
public String giveCoaching();
}
@Component
public TennisCoach implements Coach{
@Override
public String giveCoaching(){
return "Teaching forhand";
}
}
У меня есть два демонстрационных класса, в которых я ввел bean-компонент по-разному. в чем разница в обоих инъекциях
public class AppDemo{
@AutoWired
@Qualifier("tennisCoach")
private Coach theCoach;
}
public class AppDemo{
@AutoWired
private TennisCoach tennisCoach;
}
}




Если у вас есть более одной реализации для вашего интерфейса, вы получите исключение при автоматическом подключении 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;
}
Итак, вы должны квалифицировать правильный bean-компонент для CoachInterface, как показано ниже.
public class AppDemo{
@AutoWired
@Qualifier("tennisCoach")
private Coach theCoach;
}
В качестве альтернативы вы можете использовать аннотацию @Primary поверх любой из реализаций, чтобы контейнер Spring по умолчанию выбирал bean-компонент в случае более чем одной реализации для интерфейса.
Но в приведенном ниже коде вы напрямую создаете объект для реализации, а не интерфейс.
public class AppDemo{
@AutoWired
private TennisCoach tennisCoach;
}
}
Будут ли обе реализации вести себя одинаково?
да, использование аннотации Primary или Qualifier будет иметь такое же поведение с автоматическим подключением
Аннотация @Qualifier используется, когда ваш интерфейс имеет более одного реализующего класса. Вам следует выбрать тот, который вы хотите внедрить в качестве bean-компонента в контексте Spring.
Предположим, у меня есть несколько реализаций класса Coach. В одной реализации я буду вводить с помощью @Qualifier, а в другой я буду напрямую вводить bean-компонент. У меня вопрос: "Есть ли разница?"
Имена полей разные. Возможно, вы не хотите, чтобы имя поля совпадало с именем реализации компонента.