1 Обзор
Узнай сегодняSpringв рамке@Qualifier
Аннотация, какие проблемы он решает и как его использовать. Мы также узнаем о его@Primary
Разница в аннотации. Для более подробного технического анализа, пожалуйста, посетитеfelord.cn
2. Болевые точки
использовать@Autowired
АннотацияSpringОтличный способ сделать внедрение зависимостей. Но в некоторых сценариях одной этой аннотации недостаточно, чтобы Spring знал, какой из них следует внедрить.bean.
по умолчанию,@Autowired
Сборка по типуSpring Bean.
Если есть несколько контейнеров одного типаbean, фреймворк выкинетNoUniqueBeanDefinitionException
, чтобы указать, что существует несколькоbeanЗаймитесь автоматической сборкой. Программа не может правильно решить какой из них использовать.Вот живой пример:
@Component("fooFormatter")
public class FooFormatter implements Formatter {
public String format() {
return "foo";
}
}
@Component("barFormatter")
public class BarFormatter implements Formatter {
public String format() {
return "bar";
}
}
@Component
public class FooService {
@Autowired
private Formatter formatter;
//todo
}
Если мы попытаемсяFooService
загружается в наш контекст,Springкадр будет бросатьNoUniqueBeanDefinitionException
. Это потому чтоSpringне знаю что вводитьbean. Чтобы избежать этой проблемы, есть несколько решений. Итак, что мы собираемся объяснить@Qualifier
Аннотация — одна из них. Следуйте за ритмом маленького толстого брата и спускайтесь вниз.
3. @Qualifier
используя@Qualifier
аннотацию, мы можем устранить необходимость вводить какиеbeanПроблема. Давайте вернемся к предыдущему примеру и посмотрим, как мы можем это сделать, включив@Qualifier
комментарий, чтобы указать, что мы хотим использоватьbeanрешить проблему:
@Component
public class FooService {
@Autowired
@Qualifier("fooFormatter")
private Formatter formatter;
//todo
}
поставив@Qualifier
Аннотация со специфическими данными, которые мы хотим использоватьSpring beanсобраны вместе с именамиSpringКаркас может быть изготовлен из нескольких однотипных и соответствовать требованиям сборкиbeanНайдите то, что мы хотим, и избегайте разделенного мозга Spring. Все, что нам нужно сделать, это атрибут значения, объявленный в аннотации @Component или @Bean, чтобы определить имя.
На самом деле мы также можемFormatter
использовать в классе реализации@Qualifier
аннотация вместо@Component
или@Bean
Того же эффекта можно добиться, указав имя в:
@Component
@Qualifier("fooFormatter")
public class FooFormatter implements Formatter {
public String format() {
return "foo";
}
}
@Component
@Qualifier("barFormatter")
public class BarFormatter implements Formatter {
public String format() {
return "bar";
}
}
4. @Qualifier VS @Primary
Есть еще одно имя@Primary
Аннотация, которую мы также можем использовать, чтобы решить, что вводить, когда есть двусмысленность во внедрении зависимостей.bean. Когда есть несколько одинаковыхbean, эта аннотация определяет предпочтение. Если не указано иное, тот же@Primary
Связанная аннотацияbean.
Давайте посмотрим на пример:
@Bean
public Employee tomEmployee() {
return new Employee("Tom");
}
@Bean
@Primary
public Employee johnEmployee() {
return new Employee("john");
}
В этом примере оба метода возвращают одно и то жеEmployee
тип.Springбудет введеноbeanэто методjohnEmployee
возвращениеbean. Это потому, что он содержит@Primary
аннотация. Когда мы хотим указать, что определенный тип должен вводиться по умолчаниюbean, эта аннотация полезна.
Если нам нужен еще один в определенной точке впрыскаbean, мы должны указать это специально. мы можем пройти@Qualifier
Аннотация для этого. Например, мы можем использовать@Qualifier
аннотация, чтобы указать, что мы хотим использоватьtomEmployee
метод возвращенbean.
Стоит отметить, что если@Qualifier
и@Primary
аннотации существуют, то@Qualifier
Комментарии будут иметь приоритет. в основном,@Primary
определено значение по умолчанию, и@Qualifier
очень специфичен.
Конечно@Component
также можно использовать@Primary
Обратите внимание, на этот раз используется пример из 3 выше:
@Component
@Primary
public class FooFormatter implements Formatter {
public String format() {
return "foo";
}
}
@Component
public class BarFormatter implements Formatter {
public String format() {
return "bar";
}
}
при этих обстоятельствах,@Primary
В аннотации указано, что инъекция по умолчаниюFooFormatter
, что устраняет неоднозначность инъекции в сцене.
5. Автоматическая закачка по имени
в настоящее время использует@Autowired
При автопроводке, еслиSpringНикаких других подсказок, будет искать подходящее имя переменной в соответствии с именем переменной, которую необходимо ввести.bean. Это также может решить проблему неоднозначности внедрения зависимостей. Давайте посмотрим на некоторый код, основанный на нашем исходном примере:
@Component
public class FooService {
@Autowired
private Formatter fooFormatter;
//todo
}
при этих обстоятельствах,SpringопределитbeanдаFooFormatter
, потому что имя поля такое же, как у нас вbeanиз@Component
или@Bean
Значение, используемое в аннотации (по умолчанию@Bean
используйте имя метода) для соответствия.
6. Резюме
через пару@Qualifier
Мы знаем, что эта аннотация используется для устранения конфликтов внедрения зависимостей. Это в ежедневной разработке, напримерRabbtimqчасто встречается в объявлениях очередей. Брат Сяопан также показал некоторые общеупотребительные употребления, комбинируя и сравнивая эту аннотацию с другими вышеупомянутыми аннотациями. Это поможет вамSpringПонимание механизма внедрения зависимостей.
关注公众号:Felordcn获取更多资讯