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