web-dev-qa-db-fra.com

Injection de propriétés à l'aide de Spring & annotation @Value

J'essaie de charger un fichier de propriétés dans un bean Spring, puis d'injecter ce bean dans une classe.

La seule partie que je ne peux pas obtenir au travail semble être l'utilisation de la référence @ Resource. Quelqu'un peut-il connecter le dernier morceau pour moi? J'obtiens une valeur nulle à chaque fois. Ne semble pas vouloir injecter la valeur.

[EDIT] - Au départ, je pensais que l'utilisation de @ Resource était le meilleur moyen, mais la solution proposée que j'ai trouvée plus facile.

J'ai vu cette solution dans un autre article:

Lien vers la solution de référence: Inject Property Value into Spring - publié par DON

Merci à Don pour le message, mais je ne savais tout simplement pas comment le terminer avec le @ Resource.

Résultats du débogage: La valeur de la variable appProperties est toujours nulle. Ce n'est pas injecté.

Spring Config.  enter image description here

Classe d'échantillon:

package test;

import Java.util.Properties;
import javax.annotation.Resource;


public class foo {
    public foo() {}
    @Resource private Java.util.Properties appProperties;
}

Basé sur les conseils de la solution approuvée ci-dessous. Voici les modifications que j'ai apportées.


Mise à jour de la solution:

Config printemps: enter image description here

Classe Java: enter image description here

12
haju

Pour que votre solution fonctionne, vous devez également faire de foo un bean géré par Spring; car sinon, comment Spring saurait-il qu'il doit gérer l'une de vos annotations sur votre classe?

  • Vous pouvez soit le spécifier dans votre appcontext xml en tant que bean avec ..class="foo"
  • Ou utiliser component-scan et spécifiez un package de base contenant votre classe foo.

Puisque je ne suis pas tout à fait sûr que ce soit exactement ce que vous voulez (ne voulez-vous pas qu'un fichier .properties soit analysé par Spring et qu'il ait sa clé -value paires disponibles au lieu d'un Properties objet?), je vous propose une autre solution: Utiliser l'espace de noms util

<util:properties id="props" location="classpath:com/foo/bar/props.properties"/>

Et référencez les valeurs à l'intérieur de vos beans (doivent également être gérées par Spring):

@Value("#{props.foo}")
public void setFoo(String foo) {
    this.foo = foo;
}

ÉDITER:

vient de réaliser que vous importez org.springframework.context.ApplicationContext dans votre classe, ce qui est probablement inutile. Je vous encourage fortement à lire Spring reference au moins les premiers chapitres, car a) c'est une bonne lecture b) vous trouverez beaucoup plus facile de comprendre Spring si les bases sont claires.

17
abalogh

Encore une solution utilisant l'espace réservé aux propriétés.

Le contexte printanier:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:component-scan base-package="your.packege" />

    <context:property-placeholder location="classpath*:*.properties"/>

</beans>

La classe Java où vous voulez injecter des valeurs de propriétés:

public class ClassWithInjectedProperty {

    @Value("${props.foo}")
    private String foo;
}
3
alexey28