2010-11-07 13 views
8

Ich habe eine Eigenschaftendatei, die ich in Systemeigenschaften laden möchte, so dass ich über System.getProperty("myProp") darauf zugreifen kann. Derzeit bin ich versucht, den Frühling <context:propert-placeholder/> wie so zu verwenden:Wie wird die Systemeigenschaftsdatei im Frühling geladen?

<context:property-placeholder location="/WEB-INF/properties/webServerProperties.properties" /> 

Allerdings, wenn ich versuche, meine Eigenschaften für den Zugriff auf über System.getProperty("myProp") Ich erhalte null. Meine Eigenschaftendatei sieht so aus:

myProp=hello world 

Wie konnte ich das erreichen? Ich bin mir ziemlich sicher, dass ich ein Laufzeitargument setzen könnte, aber ich möchte das vermeiden.

Danke!

+0

Vielleicht [diese verwandte Frage n] (http://stackoverflow.com/questions/1311360/property-placeholder-location-from-another-property) gibt eine Richtung? – Raghuram

Antwort

9

Während ich den Spirit von Bozho's answer abonniere, hatte ich kürzlich auch eine Situation, in der ich die Systemeigenschaften von Spring einstellen musste. Hier ist die Klasse kam ich mit:

Java-Code:

public class SystemPropertiesReader{ 

    private Collection<Resource> resources; 

    public void setResources(final Collection<Resource> resources){ 
     this.resources = resources; 
    } 

    public void setResource(final Resource resource){ 
     resources = Collections.singleton(resource); 
    } 

    @PostConstruct 
    public void applyProperties() throws Exception{ 
     final Properties systemProperties = System.getProperties(); 
     for(final Resource resource : resources){ 
      final InputStream inputStream = resource.getInputStream(); 
      try{ 
       systemProperties.load(inputStream); 
      } finally{ 
       // Guava 
       Closeables.closeQuietly(inputStream); 
      } 
     } 
    } 

} 

Frühling Config:

<bean class="x.y.SystemPropertiesReader"> 

    <!-- either a single .properties file --> 
    <property name="resource" value="classpath:dummy.properties" /> 

    <!-- or a collection of .properties file --> 
    <property name="resources" value="classpath*:many.properties" /> 

    <!-- but not both --> 

</bean> 
10

Der Punkt ist, dies anders herum zu tun - d. H. Systemeigenschaften im Frühling zu verwenden, anstatt Federeigenschaften im System.

Mit PropertyPlaceholderConfigurer erhalten Sie Ihre Eigenschaften + die Systemeigenschaften über die ${property.key} Syntax zugänglich. Im Frühjahr 3.0 können Sie diese unter Verwendung der @Value Annotation injizieren.

Die Idee besteht nicht darin, sich auf Aufrufe an System.getProperty(..) zu verlassen, sondern stattdessen Ihre Eigenschaftswerte zu injizieren. Also:

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

public void someMethod { 
    String path = getPath(foo); 
    //.. etc 
} 

statt

public void someMethod { 
    String path = getPath(System.getProperty("your.property")); 
    //.. etc 
} 

Stellen Sie Einheit testen Sie Ihre Klasse wollen - Sie würden die System Objekt mit Eigenschaften vorab auszufüllen haben. Mit dem Spring-Way müssen Sie nur einige Felder des Objekts setzen.

+0

Gibt es auch eine Möglichkeit, die Eigenschaft programmatisch statt mit der Annotation mit Spring Expression Syntax zu greifen? zum Beispiel: 'someSpringApi.getProperty (" $ {foo.property} ")' – Polaris878

+0

Ja - http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch07 .html – Bozho

17

Im Frühjahr 3 Sie Systemeigenschaften auf diese Weise laden können:

<bean id="systemPropertiesLoader" 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" value="#{@systemProperties}" /> 
    <property name="targetMethod" value="putAll" /> 
    <property name="arguments"> 
     <util:properties location="file:///${user.home}/mySystemEnv.properties" /> 
    </property> 
</bean> 
Verwandte Themen