Załóżmy, że mam takie interfejsy:
interface Country {}
class USA implements Country {}
class UK implements Country ()
A ten fragment konfiguracji XML:
<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>
Jak mogę kontrolować, która zależność jest automatycznie przypisywana poniżej? Chciałbym ten z Wielkiej Brytanii.
class Main {
private Country country;
@Autowired
public void setCountry(Country country) {
this.country = country;
}
}
Używam Spring 3.0.3.RELEASE.
Odpowiedzi:
Jest to udokumentowane w sekcji 3.9.3 podręcznika Spring 3.0:
Innymi słowy, domyślne zachowanie jest takie, jakbyś został dodany
@Qualifier("country")
do metody ustawiającej.źródło
country
)Możesz użyć adnotacji @Qualifier
Z tutaj
Dostrajanie automatycznego okablowania opartego na adnotacjach z kwalifikatorami
Ponieważ automatyczne okablowanie według typu może prowadzić do wielu kandydatów, często konieczna jest większa kontrola nad procesem selekcji. Jednym ze sposobów na osiągnięcie tego jest adnotacja @Qualifier Springa. Pozwala to na kojarzenie wartości kwalifikatora z określonymi argumentami, zawężając zestaw dopasowań typów, tak aby dla każdego argumentu wybierany był określony komponent bean. W najprostszym przypadku może to być zwykła wartość opisowa:
Spowoduje to użycie Wielkiej Brytanii, dodanie identyfikatora do fasoli USA i użycie go, jeśli chcesz USA.
źródło
Innym sposobem na osiągnięcie tego samego wyniku jest użycie adnotacji @Value:
W tym przypadku
"#{country}
ciąg jest wyrażeniem Spring Expression Language (SpEL), którego wynikiem jest fasola o nazwiecountry
.źródło
Jeszcze jedno rozwiązanie z rozwiązywaniem według nazwy:
Używa pakietu javax.annotation , więc nie jest on specyficzny dla Springa, ale Spring go obsługuje.
źródło
@Resource
nie będzie po wyjęciu z pudełka z Javą 11 dzięki modułom układankiw niektórych przypadkach możesz użyć adnotacji @Primary.
W ten sposób zostanie wybrany jako domyślny kandydat na autoprzewód, bez konieczności automatycznego kandydowania na drugi ziaren.
dla mo deatils spójrz na Autowiring dwie fasole z tym samym interfejsem - jak ustawić domyślny bean na autowire?
źródło