2010-11-17 8 views
20

Mon grain de printemps ont un constructeur avec un argument obligatoire unique, et je réussi à initialiser avec la configuration xml:Comment injecter une valeur au constructeur de haricot utilisant des annotations

<bean name="interfaceParameters#ota" class="com.company.core.DefaultInterfaceParameters"> 
    <constructor-arg> 
    <value>OTA</value> 
    </constructor-arg> 
</bean> 

Puis-je utiliser ce haricot comme celui-ci et ça marche bien.

@Resource(name = "interfaceParameters#ota") 
private InterfaceParameters interfaceParameters; 

Mais je voudrais préciser la contructor valeur arg avec les annocations, quelque chose comme

@Resource(name = "interfaceParameters#ota") 
@contructorArg("ota") // I know it doesn't exists! 
private InterfaceParameters interfaceParameters; 

Est-ce possible?

Merci à l'avance

+0

Peut-être la réponse est donnée [ici] (http://stackoverflow.com/a/2306468/267197). –

Répondre

45

d'abord, vous devez spécifier le constructeur arg dans votre définition de haricots, et non dans vos points d'injection. Ensuite, vous pouvez utiliser l'annotation de printemps @Value (printemps 3,0)

@Component 
public class DefaultInterfaceParameters { 

    @Inject 
    public DefaultInterfaceParameters(@Value("${some.property}") String value) { 
     // assign to a field. 
    } 
} 

This is also encouraged as Spring advises constructor injection over field injection.

Pour autant que je vois le problème, cela pourrait ne pas vous convenir, puisque vous semblez définir plusieurs grains de la même classe, nommé différemment. Pour cela vous ne pouvez pas utiliser les annotations, vous devez les définir en XML.

Cependant, je ne pense pas que ce soit une bonne idée d'avoir ces différents grains. Vous feriez mieux d'utiliser uniquement les valeurs de chaîne. Mais je ne peux pas donner plus d'informations, car je ne connais pas vos classes exactes.

+0

merci pour votre réponse, que voulez-vous dire par "utiliser uniquement les valeurs de chaîne"? – tbruyelle

+0

Eh bien, vous avez besoin de la chaîne "OTA". Vous n'avez pas besoin d'un objet entier pour cela. – Bozho

+0

oh je vois, la chaîne "OTA" est utilisée dans la méthode @postConstruct de mon bean et c'est une information obligatoire pour construire le bean. La chaîne est utilisée pour récupérer les données de la base de données. Chaque bean de ce type renverra des données différentes pour chaque valeur de chaîne. BTW vous avez raison sur l'utilisation de xml, comme je définis plusieurs bean pour la même classe, je ne peux pas utiliser les annotations. – tbruyelle

1

Comme Bozho dit, au lieu de constructeur arg vous pouvez définir la propriété ... @ PostConstruct ne s'appelé après que toutes les propriétés sont définies ... donc, vous aurez toujours votre chaîne disponible ...