W jaki sposób Spring autowire według nazwy, gdy zostanie znalezionych więcej niż jedna pasująca fasola?


106

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.


Pomyślałem, że dodam, że otrzymuję "Żadnego unikalnego ziarna typu ..." w jednym (testowym) środowisku i działało dobrze w moim środowisku programistycznym. Jestem pewien, że było to coś w rodzaju ścieżki klas, ale okazało się, że jeśli dodasz @Qualifier, zadziałało dobrze.
markthegrea

Odpowiedzi:


113

Jest to udokumentowane w sekcji 3.9.3 podręcznika Spring 3.0:

W przypadku dopasowania rezerwowego nazwa komponentu bean jest uznawana za domyślną wartość kwalifikatora.

Innymi słowy, domyślne zachowanie jest takie, jakbyś został dodany @Qualifier("country")do metody ustawiającej.


Kiedy mówisz „nazwa ziarna”, czy masz na myśli nazwę pola, które będzie zawierało ziarno? (tj. w tym przypadku country)
Pozew Moniki o fundusz

67

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:

class Main {
    private Country country;
    @Autowired
    @Qualifier("country")
    public void setCountry(Country country) {
        this.country = country;
    }
}

Spowoduje to użycie Wielkiej Brytanii, dodanie identyfikatora do fasoli USA i użycie go, jeśli chcesz USA.


12

Innym sposobem na osiągnięcie tego samego wyniku jest użycie adnotacji @Value:

public class Main {
     private Country country;

     @Autowired
     public void setCountry(@Value("#{country}") Country country) {
          this.country = country;
     }
}

W tym przypadku "#{country}ciąg jest wyrażeniem Spring Expression Language (SpEL), którego wynikiem jest fasola o nazwie country.


czy można to wstrzyknąć na podstawie własności? co, jeśli USA lub Wielka Brytania to jakiś parametr pochodzący z adresu URL i chcę wstrzyknąć 2 różne rzeczy w zależności od tego, jaki jest parametr?
Kalpesh Soni

6

Jeszcze jedno rozwiązanie z rozwiązywaniem według nazwy:

@Resource(name="country")

Używa pakietu javax.annotation , więc nie jest on specyficzny dla Springa, ale Spring go obsługuje.


1
ale @Resourcenie będzie po wyjęciu z pudełka z Javą 11 dzięki modułom układanki
Dirk Hoffmann

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.