Как Spring autowire по имени, когда найдено более одного соответствующего компонента?
Предположим, у меня есть такие интерфейсы, как:
interface Country {}
class USA implements Country {}
class UK implements Country ()
и этот фрагмент конфигурации xml:
<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>
как я могу контролировать, какая зависимость является autowired ниже? Я бы хотел британский.
class Main {
private Country country;
@Autowired
public void setCountry(Country country) {
this.country = country;
}
}
Я использую пружину 3.0.3.ОСВОБОЖДАТЬ.
5 ответов:
это задокументировано в 3.9.3 из руководства Spring 3.0:
для резервного соответствия имя компонента считается значением квалификатора по умолчанию.
другими словами, поведение по умолчанию, как если бы вы добавили
@Qualifier("country")
на сеттера.
вы можете использовать аннотацию @Qualifier
С здесь
точная настройка аннотации на основе автопроводки с квалификаторами
С связывание, то по типу может привести к нескольким кандидатам, часто необходимо иметь больше контроля над процессом отбора. Один из способов сделать это-с аннотацией @Qualifier Spring. Это позволяет связывать значения квалификатора с определенными аргументами, сужая набор совпадений типов таким образом, что a для каждого аргумента выбирается конкретный Боб. В простейшем случае это может быть простое описательное значение:
class Main { private Country country; @Autowired @Qualifier("country") public void setCountry(Country country) { this.country = country; } }
Это будет использовать Великобритания добавить идентификатор в США bean и использовать его, если вы хотите США.
другой способ достижения того же результата-использовать аннотацию @Value:
public class Main { private Country country; @Autowired public void setCountry(@Value("#{country}") Country country) { this.country = country; } }
В этом случае
"#{country}
строка Язык Весеннего Выражения (SpEL) выражение, которое вычисляет боб с именемcountry
.
еще одно решение с решением на имя:
@Resource(name="country")
Он использует javax.аннотация пакет, поэтому это не Весна специфическая, но весна поддерживает его.
в некоторых случаях вы можете использовать аннотацию @начальной.
@Primary class USA implements Country {}
таким образом, он будет выбран в качестве кандидата autowire по умолчанию, без необходимости autowire-candidate на другом компоненте.
для МО deatils посмотрите на Autowiring два компонента, реализующие один и тот же интерфейс - как установить компонент по умолчанию для autowire?