2010-01-28 6 views
48

J'aime l'injection basée sur le constructeur car elle me permet de faire des champs injectés final. J'aime aussi l'injection par annotation car elle simplifie mon context.xml. Je peux marquer mon constructeur avec @Autowired et tout fonctionne bien, tant que je n'ai pas deux paramètres du même type. Par exemple, j'ai une classe:Spring - injecter 2 haricots de même type

@Component 
public class SomeClass { 
    @Autowired(required=true) 
    public SomeClass(OtherClass bean1, OtherClass bean2) { 
     … 
    } 
} 

et un contexte d'application avec:

<bean id="bean1" class="OtherClass" /> 
<bean id="bean2" class="OtherClass" /> 

Il devrait y avoir un moyen de spécifier l'ID de haricot sur le constructeur de la classe SomeClass, mais je peux » Je le trouve dans la documentation. Est-ce possible, ou est-ce que je rêve d'une solution qui n'existe pas encore?

Répondre

72

@Autowired est par type (dans ce cas); utiliser @Qualifier à lier automatiquement par nom, suivant l'exemple from spring docs:

public SomeClass(
    @Qualifier("bean1") OtherClass bean1, 
    @Qualifier("bean2") OtherClass bean2) { 
    ... 
} 

Note: Contrairement à @Autowired qui est applicable aux champs, constructeurs et méthodes multi-arguments (permettant rétrécissant par le biais des annotations de qualification à la niveau de paramètre), @Resource n'est pris en charge que pour les champs et les méthodes de définition de propriétés de bean avec un seul argument. En conséquence, respectez les qualificatifs si votre cible d'injection est un constructeur ou une méthode multi-arguments.

(ci-dessous ce texte est l'exemple complet)

+2

'@ Autowire' est par nom aussi, mais dans ce cas, vous devez fournir setters. Mais ici, les arguments constructeur sont préférés, et '@ Autowire' ne fonctionnera pas si les deux arguments sont du même type. Par conséquent, la chose peut être résolue en utilisant '@ Qualifier'. –

+0

a précisé la réponse. – Bozho

+0

Remarqué ....... + 1 –

Questions connexes