2014-01-22 15 views
8

Ich habe einen Frühling-Managed-Bean, die Eigenschaften mit einem property-placeholder in der damit verbundenen context.xml lädt:Dynamic @ Value-Äquivalent im Frühjahr?

<context:property-placeholder location="file:config/example.prefs" /> 

I Eigenschaften mit Hilfe Spring @Value Anmerkungen bei der Initialisierung zugreifen kann, zB:

@Value("${some.prefs.key}") 
String someProperty; 

... aber ich muss diese Eigenschaften anderen (nicht von Spring verwalteten) Objekten auf generische Weise zugänglich machen. Im Idealfall könnte ich sie durch ein Verfahren aussetzen wie:

public String getPropertyValue(String key) { 
    @Value("${" + key + "}") 
    String value; 

    return value; 
} 

... aber natürlich kann ich nicht die @Value Anmerkung in diesem Zusammenhang verwenden. Gibt es irgendeine Weise, die ich die Eigenschaften von Spring aus example.prefs zur Laufzeit mit den Tasten geladen zugreifen kann, z.B .:

public String getPropertyValue(String key) { 
    return SomeSpringContextOrEnvironmentObject.getValue(key); 
} 
+2

ich denke, das ist das, was Sie suchen: http://stackoverflow.com/questions/1771166/access-properties-file -programatically-with-spring/6817902 # 6817902 –

+1

Ich würde eine Nomral-Bohne erstellen, die die Frühlingsbohne als Construtr-Argument nimmt, wobei die Frühlingsbohne ihre Werte bereits so festgelegt hat, wie sie vom Frühling instanziiert wurde. Ich denke, das hängt etwas von Ihrer Architektur ab. – NimChimpsky

+0

Können Sie uns mehr über das sagen, was Sie "non-Spring managed" nennen? –

Antwort

5

Autowire Umwelt Objekt in Ihrer Klasse. Dann können Sie mit environment.getProperty (propertyName) auf die Eigenschaften zugreifen.

@Autowired 
private Environment environment; 

// access it as below wherever required. 
environment.getProperty(propertyName); 

Fügen Sie auch @PropertySource zur Config-Klasse hinzu.

@Configuration 
@PropertySource("classpath:some.properties") 
public class ApplicationConfiguration 
+0

Funktionierte nicht für mich, die beste Lösung war diese [PropertyPlaceholderExposer] (https://Stackoverflow.com/a/10200249) mit etwas Vereinfachung. –

+0

@ SérgioMichels Der Ansatz, den Sie erwähnt haben, verwendet PropertyPlaceholderConfigurer, die alte Methode in Spring-Konfiguration verwendet wurde. https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html Dokumente schlagen vor, Enviornment zu verwenden. –

0

injizieren BeanFactory in Ihre Bohne.

@Autowired 
BeanFactory factory; 

dann gegossen und die Eigenschaft, von der Bohne

((ConfigurableBeanFactory) factory).resolveEmbeddedValue("${propertie}")