Supposons que j'ai des interfaces telles que celles-ci:
interface Country {}
class USA implements Country {}
class UK implements Country ()
Et cet extrait de configuration xml:
<bean class="USA"/>
<bean id="country" class="UK"/>
<bean id="main" class="Main"/>
Comment puis-je contrôler quelle dépendance est câblée automatiquement ci-dessous? J'aimerais le Royaume-Uni.
class Main {
private Country country;
@Autowired
public void setCountry(Country country) {
this.country = country;
}
}
J'utilise Spring 3.0.3.RELEASE.
Réponses:
Ceci est documenté dans la section 3.9.3 du manuel Spring 3.0:
En d'autres termes, le comportement par défaut est comme si vous aviez ajouté
@Qualifier("country")
à la méthode setter.la source
country
)Vous pouvez utiliser l'annotation @Qualifier
D' ici
Affiner le câblage automatique basé sur les annotations avec des qualificatifs
Étant donné que le câblage automatique par type peut conduire à plusieurs candidats, il est souvent nécessaire d'avoir plus de contrôle sur le processus de sélection. Une façon d'y parvenir est d'utiliser l'annotation @Qualifier de Spring. Cela permet d'associer des valeurs de qualificatif à des arguments spécifiques, réduisant ainsi l'ensemble des correspondances de type afin qu'un bean spécifique soit choisi pour chaque argument. Dans le cas le plus simple, cela peut être une valeur descriptive simple:
Cela utilisera le Royaume-Uni, ajoutera un identifiant au bean USA et l'utilisera si vous voulez les USA.
la source
Une autre façon d'obtenir le même résultat consiste à utiliser l'annotation @Value:
Dans ce cas, la
"#{country}
chaîne est une expression SpEL (Spring Expression Language) qui correspond à un bean nommécountry
.la source
Une autre solution avec la résolution par nom:
Il utilise le package javax.annotation , il n'est donc pas spécifique à Spring, mais Spring le prend en charge.
la source
@Resource
ne sera pasdans certains cas, vous pouvez utiliser l'annotation @Primary.
De cette façon, il sera sélectionné comme candidat par défaut pour le câblage automatique, sans avoir besoin de faire le câblage automatique du candidat sur l'autre bean.
Pour les mo deatils, regardez Autowiring deux beans implémentant la même interface - comment définir le bean par défaut sur autowire?
la source