web-dev-qa-db-fra.com

Comment obtenir une valeur de propriété à partir d'un objet ApplicationContext? (sans utiliser d'annotation)

Si j'ai:

@Autowired private ApplicationContext ctx;

Je peux obtenir des beans et des ressources en utilisant l'une des méthodes getBean. Cependant, je ne peux pas comprendre comment obtenir les valeurs des propriétés.

Évidemment, je peux créer un nouveau bean qui a une propriété @Value comme:

private @Value("${someProp}") String somePropValue;

Quelle méthode dois-je appeler sur l'objet ApplicationContext pour obtenir cette valeur sans câbler automatiquement un bean?

J'utilise généralement la @Value, mais il y a une situation où l'expression SPeL doit être dynamique, donc je ne peux pas simplement utiliser une annotation.

39
HappyEngineer

Dans le cas où l'expression SPeL doit être dynamique, obtenez la valeur de la propriété manuellement:

somePropValue = ctx.getEnvironment().getProperty("someProp");
47
Italo Borssatto

En supposant que le ${someProp} la propriété provient d'un PropertyPlaceHolderConfigurer, ce qui rend les choses difficiles. Le PropertyPlaceholderConfigurer est un BeanFactoryPostProcessor et en tant que tel, uniquement disponible au démarrage du conteneur. Les propriétés ne sont donc pas disponibles pour un bean lors de l'exécution.

Une solution serait de créer une sorte de bean détenteur de valeur que vous initialisez avec la propriété/les propriétés dont vous avez besoin.

@Component
public class PropertyHolder{

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

    // + getter methods
}

Injectez maintenant ce PropertyHolder où vous avez besoin des propriétés et accédez aux propriétés via les méthodes getter

15

Si vous êtes bloqué sur Spring pre 3.1, vous pouvez utiliser

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");
10
Asa