Angenommen, ich habe Schnittstellen wie diese:
interface Country {}
class USA implements Country {}
class UK implements Country ()
Und dieser Ausschnitt aus der Konfigurations-XML:
<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>
Wie kann ich steuern, welche Abhängigkeit unten automatisch verdrahtet wird? Ich hätte gerne die in Großbritannien.
class Main {
private Country country;
@Autowired
public void setCountry(Country country) {
this.country = country;
}
}
Ich benutze Spring 3.0.3.RELEASE.
Antworten:
Dies ist in Abschnitt 3.9.3 des Spring 3.0-Handbuchs dokumentiert:
Mit anderen Worten, das Standardverhalten ist so, als hätten Sie
@Qualifier("country")
der Setter-Methode hinzugefügt .quelle
country
)Sie können die Annotation @Qualifier verwenden
Von hier aus
Feinabstimmung der annotationsbasierten automatischen Verdrahtung mit Qualifikationsmerkmalen
Da die automatische Verdrahtung nach Typ zu mehreren Kandidaten führen kann, ist es häufig erforderlich, mehr Kontrolle über den Auswahlprozess zu haben. Eine Möglichkeit, dies zu erreichen, ist die Annotation @Qualifier von Spring. Auf diese Weise können Qualifikationswerte bestimmten Argumenten zugeordnet werden, wodurch die Menge der Typübereinstimmungen eingegrenzt wird, sodass für jedes Argument eine bestimmte Bean ausgewählt wird. Im einfachsten Fall kann dies ein einfacher beschreibender Wert sein:
Dies wird in Großbritannien verwendet. Fügen Sie der USA-Bean eine ID hinzu, und verwenden Sie diese, wenn Sie die USA möchten.
quelle
Eine andere Möglichkeit, dasselbe Ergebnis zu erzielen, ist die Verwendung der Annotation @Value:
In diesem Fall ist die
"#{country}
Zeichenfolge ein SpEL- Ausdruck (Spring Expression Language) , der als Bean mit dem Namen ausgewertet wirdcountry
.quelle
Eine weitere Lösung mit Namensauflösung:
Es verwendet das Paket javax.annotation , ist also nicht Spring-spezifisch, aber Spring unterstützt es.
quelle
@Resource
wird nicht mit Java 11 aufgrund von Puzzle-Modulen sofort einsatzbereit seinIn einigen Fällen können Sie die Annotation @Primary verwenden.
Auf diese Weise wird es als Standard-Autowire-Kandidat ausgewählt, ohne dass ein Autowire-Kandidat für die andere Bean erforderlich ist.
Weitere Informationen finden Sie unter Autowiring, zwei Beans, die dieselbe Schnittstelle implementieren. Wie wird die Standard-Bean auf Autowire gesetzt?
quelle