Как 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 85

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?