2010-11-07 31 views
8

Tengo un archivo de propiedades que me gustaría cargar en Propiedades del sistema para que pueda acceder a él a través del System.getProperty("myProp"). Actualmente, estoy tratando de utilizar la primavera <context:propert-placeholder/> así:Cómo cargar el archivo de propiedades del sistema en Spring?

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

Sin embargo, cuando intento acceder a mis propiedades a través de System.getProperty("myProp") Me estoy null. Mi archivo de propiedades se ve así:

myProp=hello world 

¿Cómo puedo lograr esto? Estoy bastante seguro de poder establecer un argumento de tiempo de ejecución, sin embargo me gustaría evitar esto.

Gracias!

+0

Quizás [esta questio relacionada n] (http://stackoverflow.com/questions/1311360/property-placeholder-location-from-another-property) da alguna dirección? – Raghuram

Respuesta

9

Mientras me suscribo al Spirit of Bozho's answer, recientemente también tuve una situación en la que tuve que configurar Propiedades del sistema desde Spring. Aquí está la clase que se me ocurrió:

Código Java:

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); 
      } 
     } 
    } 

} 

primavera 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

El punto es hacer esto al revés, es decir, utilizar las propiedades del sistema en primavera, en lugar de las propiedades de resorte en el sistema.

Con PropertyPlaceholderConfigurer obtiene sus propiedades + las propiedades del sistema accesibles a través de la sintaxis ${property.key}. En la primavera 3.0, puede inyectarlos usando la anotación @Value.

La idea es no depender de las llamadas al System.getProperty(..), sino inyectar los valores de su propiedad. Por lo tanto:

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

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

en lugar de

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

Imagínese que desea probar su unidad de clase - que tendría que rellenar previamente el objeto System con propiedades. Con el camino de primavera solo tendrías que establecer algunos campos del objeto.

+0

¿Existe también una forma de obtener la propiedad mediante programación en lugar de utilizar la anotación con la sintaxis Spring Expression? por ejemplo: 'someSpringApi.getProperty (" $ {foo.property} ")' – Polaris878

+0

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

17

En primavera 3 que es posible cargar las propiedades del sistema de esta manera:

<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> 
Cuestiones relacionadas