2010-10-19 55 views
84

¿Cómo se lee la variable de entorno del sistema en el contexto de la aplicación?cómo leer Variable de entorno del sistema en Spring applicationContext

Quiero algo como:

<util:properties id="dbProperties" 
     location="classpath:config_DEV/db.properties" /> 

o

<util:properties id="dbProperties" 
     location="classpath:config_QA/db.properties" /> 

dependiendo por el planeta.

¿Puedo tener algo así en mi aplicación Contexto?

<util:properties id="dbProperties" 
     location="classpath:config_${systemProperties.env}/db.properties" /> 

donde el val real se establece en función de la variable de entorno del sistema

estoy usando Spring 3.0

Respuesta

23

Sí, puede hacerlo <property name="defaultLocale" value="#{ systemProperties['user.region']}"/> por ejemplo.

La variable sistemaLas propiedades están predefinidas, consulte 6.4.1 XML based configuration.

85

Usted está cerca: o) Spring 3.0 agrega Spring Expression Language. Puede utilizar

<util:properties id="dbProperties" 
    location="classpath:config_#{systemProperties['env']}/db.properties" /> 

Combinado con java ... -Denv=QA debe resolver su problema.

Tenga en cuenta también un comentario de @yiling:

Con el fin de tener acceso al sistema variable de entorno, es decir, nivel de sistema operativo como variables amoe comentado, podemos simplemente usar "systemEnvironment" en lugar de "" en SystemProperties ese EL. Al igual que #{systemEnvironment['ENV_VARIABLE_NAME']}

+0

¿cuál es el java ... -Denv = QA significa? –

+2

Establece un valor de propiedad del sistema java. Puede leer este valor en código como 'assert System.getProperty (" env ") ==" QA ";' – amra

+0

Creo que esta respuesta es incorrecta, esto no permite leer las variables de entorno del sistema (es decir, las variables de nivel de sistema operativo configuradas con 'export', etc.), solo permite leer las propiedades del sistema Java. – amoe

8

En su definición de frijol, asegúrese de incluir "searchSystemEnvironment" y ponerlo en "verdadero". Y si lo está usando para crear una ruta a un archivo, especifíquelo como un archivo: /// url.

Así, por ejemplo, si tiene un archivo de configuración ubicado en

/testapp/config/my.app.config.properties 

a continuación, establecer una variable de entorno, así:

MY_ENV_VAR_PATH=/testapp/config 

y su aplicación puede cargar el archivo con una definición de frijol como esto:

por ejemplo

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="searchSystemEnvironment" value="true" /> 
    <property name="searchContextAttributes" value="true" /> 
    <property name="contextOverride" value="true" /> 
    <property name="ignoreResourceNotFound" value="true" /> 
    <property name="locations"> 
     <list> 
      <value>file:///${MY_ENV_VAR_PATH}/my.app.config.properties</value> 
     </list> 
    </property> 
</bean> 
+2

ahora ¿cómo puedo leer las propiedades cargadas en java? – Bhuvan

5

Para mi caso de uso, necesitaba acceder solo a las propiedades del sistema, pero proporciono valores por defecto en caso de que no estén definidas.

Esta es la forma de hacerlo:

<bean id="propertyPlaceholderConfigurer" 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="searchSystemEnvironment" value="true" /> 
</bean> 
<bean id="myBean" class="path.to.my.BeanClass"> 
    <!-- can be overridden with -Dtest.target.host=http://whatever.com --> 
    <constructor-arg value="${test.target.host:http://localhost:18888}"/> 
</bean> 
6

utilizando Spring EL se puede eis example escribir de la siguiente manera

<bean id="myBean" class="path.to.my.BeanClass"> 
    <!-- can be overridden with -Dtest.target.host=http://whatever.com --> 
    <constructor-arg value="#{systemProperties['test.target.host'] ?: 'http://localhost:18888'}"/> 
</bean> 
+0

Buena pista sobre el valor predeterminado –

1

Así es como se hace:

<bean id="systemPrereqs" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" scope="prototype"> 
      <property name="targetObject" value="#{@systemProperties}" /> 
      <property name="targetMethod" value="putAll" /> 
      <property name="arguments"> 
        <util:properties> 
         <prop key="deployment.env">dev</prop> 
        </util:properties> 
      </property> 
    </bean> 

Pero recuerde la primavera se carga primero y luego carga este bean MethodInvokingFactoryBean. Entonces, si está tratando de usar esto para su caso de prueba, asegúrese de usar depends-on. Por ej. en este caso

En caso de que lo están utilizando para su clase principal mejor establecer esta propiedad mediante su pom.xml como

<systemProperty> 
    <name>deployment.env</name> 
    <value>dev</value> 
</systemProperty> 
27

Hoy en día se puede poner

@Autowired 
private Environment environment; 

en su @Component, @Bean, etc., y luego acceda a las propiedades a través de la clase Environment:

environment.getProperty("myProp"); 

Para una sola propiedad en un @Bean

@Value("${my.another.property:123}") // value after ':' is the default 
Integer property; 

Otra forma son las prácticas judías @ConfigurationProperties:

@ConfigurationProperties(prefix="my.properties.prefix") 
public class MyProperties { 
    // value from my.properties.prefix.myProperty will be bound to this variable 
    String myProperty; 

    // and this will even throw a startup exception if the property is not found 
    @javax.validation.constraints.NotNull 
    String myRequiredProperty; 

    //getters 
} 

@Component 
public class MyOtherBean { 
    @Autowired 
    MyProperties myProperties; 
} 

Nota: Sólo recuerde reiniciar Eclipse después de establecer una nueva variable de entorno

+0

¿Las variables de env también son accesibles a través de la interfaz 'Environment'? –

+0

@NikhilSahu Sí, lo son. Accedes a ellos con la misma clave que cuando consultas 'java.lang.System'; por ejemplo, para obtener el tipo de SO que harías' env.getProperty ("os.name") 'asumiendo que' env' es tu instancia de 'org .springframework.core.env.Environment'. – Ninetou

-2

Para obtener un valor de la variable de sistema, el uso Simpy continuación Código:

System.getenv("property-name"); 
1

Se puede mencionar sus atributos variables en un archivo de propiedades y definir archivos de propiedades específicas del entorno como local.properties, production.propertied, etc.

Ahora, en función del entorno, uno de estos archivos de propiedades puede leerse en uno de los oyentes invocados al inicio, como el ServletContextListener.

El archivo de propiedad contendrá los valores específicos del entorno para varias claves.

de ejemplo "local.propeties"

db.logsDataSource.url=jdbc:mysql://localhost:3306/logs 
db.logsDataSource.username=root 
db.logsDataSource.password=root 

db.dataSource.url=jdbc:mysql://localhost:3306/main 
db.dataSource.username=root 
db.dataSource.password=root 

Muestra de producción".propiedades"

db.logsDataSource.url=jdbc:mariadb://111.111.111.111:3306/logs 
db.logsDataSource.username=admin 
db.logsDataSource.password=xyzqer 

db.dataSource.url=jdbc:mysql://111.111.111.111:3306/carsinfo 
db.dataSource.username=admin 
[email protected] 

Para utilizar estas propiedades de archivos, puede hacer uso del recurso como se menciona más adelante

 PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); 
     ResourceLoader resourceLoader = new DefaultResourceLoader(); 

     Resource resource = resourceLoader.getResource("classpath:"+System.getenv("SERVER_TYPE")+"DB.properties"); 
     configurer.setLocation(resource); 
     configurer.postProcessBeanFactory(beanFactory); 

SERVER_TYPE puede definirse como la variable de entorno con los valores apropiados para el medio ambiente local y la producción.

Con estos cambios, appplicationContext.xml tendrá los siguientes cambios

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
<property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="${db.dataSource.url}" /> 
    <property name="username" value="${db.dataSource.username}" /> 
    <property name="password" value="${db.dataSource.password}" /> 

Espero que esto ayude.

4

declarar el marcador de posición propiedad como sigue

<bean id="propertyPlaceholderConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="locations"> 
     <list> 
      <value>file:///path.to.your.app.config.properties</value> 
     </list> 
    </property> 
</bean> 

Entonces digamos que usted quiere leer System.property("java.io.tmpdir") para su grano de Tomcat o cualquier frijol a continuación, añadir siguiente en su archivo de propiedades:

tomcat.tmp.dir=${java.io.tmpdir} 
0

Gracias a @Yiling. Esa fue una pista.

<bean id="propertyConfigurer" 
     class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 

    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
    <property name="searchSystemEnvironment" value="true" /> 
    <property name="locations"> 
     <list> 
      <value>file:#{systemEnvironment['FILE_PATH']}/first.properties</value> 
      <value>file:#{systemEnvironment['FILE_PATH']}/second.properties</value> 
      <value>file:#{systemEnvironment['FILE_PATH']}/third.properties</value> 
     </list> 
    </property> 
</bean> 

Después de esto, debe tener una variable de entorno llamada 'FILE_PATH'. Asegúrese de reiniciar su máquina después de crear esa variable de entorno.

Cuestiones relacionadas