В чем разница между использованием аннотации @Qualifier и прямым внедрением bean-компонента весной?

Допустим, у меня есть программа

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

Имена полей разные. Возможно, вы не хотите, чтобы имя поля совпадало с именем реализации компонента.

Erwin Bolwidt 02.11.2018 07:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
160
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если у вас есть более одной реализации для вашего интерфейса, вы получите исключение при автоматическом подключении 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;
  }
}

Будут ли обе реализации вести себя одинаково?

parag gupta 02.11.2018 09:54

да, использование аннотации Primary или Qualifier будет иметь такое же поведение с автоматическим подключением

Deepak Gunasekaran 13.09.2021 12:07

Аннотация @Qualifier используется, когда ваш интерфейс имеет более одного реализующего класса. Вам следует выбрать тот, который вы хотите внедрить в качестве bean-компонента в контексте Spring.

Предположим, у меня есть несколько реализаций класса Coach. В одной реализации я буду вводить с помощью @Qualifier, а в другой я буду напрямую вводить bean-компонент. У меня вопрос: "Есть ли разница?"

parag gupta 02.11.2018 08:15

Другие вопросы по теме