121 votes

Comment Spring nomme-t-il son nom lorsque plus d'un haricot correspondant est trouvé?

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 autowired ci-dessous? Je voudrais le Royaume-Uni.

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

J'utilise Spring 3.0.3.LELEASE.

132voto

skaffman Points 197885

Ceci est documenté dans la section 3.9.3 :

Pour une correspondance de secours, le nom du bean est considéré comme une valeur de qualificateur par défaut.

En d'autres termes, le comportement par défaut est comme si vous aviez ajouté @Qualifier("country") à la méthode setter.

77voto

Paul Whelan Points 8620

Vous pouvez utiliser le @Qualifier d'annotation

À partir d' ici

Fine-tuning annotation de base permettra à l'autowiring avec des qualificatifs

Depuis permettra à l'autowiring 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 avec le Printemps @Qualifier d'annotation. Cela permet d'associer des valeurs qualifiées avec des arguments précis, la réduction de l'ensemble de type de matchs pour qu'une fève est choisi pour chaque argument. Dans le cas le plus simple, cela peut être une simple valeur descriptive:

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

Cela permettra d'utiliser au royaume-UNI ajouter un id USA de haricots et de l'utiliser si vous voulez que les états-unis.

13voto

Ricardo Veguilla Points 1130

Un autre moyen d'obtenir le même résultat consiste à utiliser l'annotation @Value:

 public class Main {
     private Country country;

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

Dans ce cas, la chaîne "#{country} est une expression SpEL (Spring Expression Language) qui correspond à un bean nommé country .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X