web-dev-qa-db-fra.com

Comment injecter une valeur au constructeur de bean à l'aide d'annotations

Mon bean Spring a un constructeur avec un argument obligatoire unique, et j'ai réussi à l'initialiser avec la configuration xml:

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

Ensuite, j'utilise ce bean comme ça et ça marche bien.

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

Mais je voudrais spécifier la valeur d'arg du constructeur 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 d'avance

27
tbruyelle

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

@Component
public class DefaultInterfaceParameters {

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

Ceci est également encouragé car Spring conseille l'injection du constructeur plutôt que l'injection sur le terrain.

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

Cependant, je ne pense pas que ce soit une si 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.

64
Bozho

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

2
tapasvi