wake-up-neo.com

Wie erhalte ich einen Eigenschaftswert von einem ApplicationContext-Objekt? (ohne Anmerkung)

Wenn ich habe:

@Autowired private ApplicationContext ctx;

Ich kann Beans und Ressourcen mit einer der getBean-Methoden abrufen. Ich kann jedoch nicht herausfinden, wie Eigenschaftswerte abgerufen werden.

Natürlich kann ich eine neue Bean erstellen, die eine @Value-Eigenschaft wie folgt hat:

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

Welche Methode rufe ich für das ApplicationContext-Objekt auf, um diesen Wert abzurufen, ohne eine Bean automatisch zu verdrahten?

Normalerweise verwende ich @Value, aber es gibt Situationen, in denen der SPeL-Ausdruck dynamisch sein muss, sodass ich nicht einfach eine Anmerkung verwenden kann.

39
HappyEngineer

Wenn der SPeL-Ausdruck dynamisch sein muss, rufen Sie den Eigenschaftswert manuell ab:

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

Angenommen, die ${someProp} -Eigenschaft stammt aus einem PropertyPlaceHolderConfigurer, was die Dinge schwierig macht. Der PropertyPlaceholderConfigurer ist ein BeanFactoryPostProcessor und daher nur beim Start des Containers verfügbar. Daher stehen die Eigenschaften einer Bean zur Laufzeit nicht zur Verfügung.

Eine Lösung wäre, eine Art Value-Holder-Bean zu erstellen, die Sie mit den Eigenschaften initialisieren, die Sie benötigen.

@Component
public class PropertyHolder{

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

    // + getter methods
}

Fügen Sie diesen PropertyHolder nun überall dort ein, wo Sie die Eigenschaften benötigen, und greifen Sie über die Getter-Methoden auf die Eigenschaften zu

15

Wenn Sie mit Spring vor 3.1 nicht weiterkommen, können Sie verwenden

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