Spring uygulamasında Sistem ortam değişkeni nasıl okunur?


116

Uygulama bağlamında sistem ortamı değişkeni nasıl okunur?

Ben şöyle bir şey istiyorum:

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

veya

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

çevreye bağlı olarak.

Başvurumun Bağlamında buna benzer bir şey olabilir mi?

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

gerçek değer, SİSTEM ÇEVRE DEĞİŞKENİ'ne göre ayarlandığında

Spring 3.0 kullanıyorum

Yanıtlar:



106

Yakındasınız: o) Spring 3.0, Spring Expression Language'i ekler . Kullanabilirsiniz

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

İle birleştirildiğinde java ... -Denv=QAsorununuzu çözmelisiniz.

Ayrıca @yiling tarafından yapılan bir yoruma da dikkat edin:

Sistem ortam değişkenine, yani işletim sistemi düzeyindeki değişkenlere erişmek için, bu EL'de "systemProperties" yerine "systemEnvironment" ı kullanabiliriz. Sevmek #{systemEnvironment['ENV_VARIABLE_NAME']}


java ... -Denv = QA ne anlama geliyor?
fresh_dev

2
Bir java sistemi özelliği değeri belirlersiniz. Bu değeri şu kodda okuyabilirsinizassert System.getProperty("env") == "QA";
amra

Bu cevabın yanlış olduğunu düşünüyorum, bu sistem ortam değişkenlerinin okunmasına izin vermiyor (yani işletim sistemi düzeyinde değişkenler export, vb.), Sadece Java sistem özelliklerinin okunmasına izin veriyor.
amoe

2
-Dprop = ... komut satırında bir java özelliği ayarlar. Bu özelliği üzerinden okuyabilirsiniz System.getProperty("prop"). Bir işletim sistemi özelliğini okumak isterseniz System.getenv("os-env-variable"). Bkz. Javadoc: docs.oracle.com/javase/6/docs/api/java/lang/System.html
amra

22
Sistem ortam değişkenine, yani işletim sistemi düzeyindeki değişkenlere erişmek için, bu EL'de "systemProperties" yerine "systemEnvironment" ı kullanabiliriz. Beğen #{systemEnvironment['ENV_VARIABLE_NAME']}.
Yiling

51

Bugünlerde koyabilirsin

@Autowired
private Environment environment;

Gözlerinde farklı @Component, @Beanvb ve ardından özelliklerine erişmek Environmentsınıfta:

environment.getProperty("myProp");

Tek bir mülk için@Bean

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

Başka bir yol da kullanışlı @ConfigurationPropertiesçekirdekler:

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

Not: Yeni bir ortam değişkeni ayarladıktan sonra tutulmayı yeniden başlatmayı unutmayın.


1
Env değişkenlerine Environmentarayüz aracılığıyla da erişilebilir mi?
Nikhil Sahu

@NikhilSahu Evet, öyleler. Örneğinizin sizin örneğiniz olduğunu varsayarak java.lang.SystemOS türünü almak için sorgulama yaparken yaptığınız gibi onlara aynı anahtarla erişirsiniz . env.getProperty("os.name")envorg.springframework.core.env.Environment
Ninetou

1
@Autowired private Environment environment;benim Component
ortamım


8

Fasulye tanımınızda "searchSystemEnvironment" ı eklediğinizden ve "true" olarak ayarladığınızdan emin olun. Ve bir dosyanın yolunu oluşturmak için kullanıyorsanız, bunu bir file: /// url olarak belirtin.

Örneğin, bir yapılandırma dosyanız varsa

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

ardından aşağıdaki gibi bir ortam değişkeni ayarlayın:

MY_ENV_VAR_PATH=/testapp/config

ve uygulamanız, aşağıdaki gibi bir fasulye tanımı kullanarak dosyayı yükleyebilir:

Örneğin

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

8

Spring EL'i kullanarak aşağıdaki gibi örnek yazabilirsiniz

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

5

Kullanım durumum için, yalnızca sistem özelliklerine erişmem gerekiyordu, ancak tanımsız olmaları durumunda varsayılan değerleri sağlamam gerekiyordu.

Bunu nasıl yapıyorsun:

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

4

Mülk sahibini aşağıdaki şekilde beyan edin

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

Öyleyse System.property("java.io.tmpdir"), Tomcat fasulyeniz veya herhangi bir fasulye için okumak istediğinizi varsayalım ve ardından özellikler dosyanıza aşağıdakileri ekleyelim:

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

1

Bunu nasıl yapıyorsun:

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

Ancak, ilk önce yay yüklendiğini ve ardından bu bean MethodInvokingFactoryBean'i yükleyeceğini unutmayın. Bu nedenle, bunu test durumunuz için kullanmaya çalışıyorsanız, bağımlı olanı kullandığınızdan emin olun. Örneğin bu durumda

Ana sınıfınız için kullanıyorsanız, bu özelliği pom.xml dosyanızı olarak

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

1

Değişken özelliklerinizden bir özellik dosyasında bahsedebilir ve local.properties, production.propertied vb. Gibi ortama özgü özellik dosyalarını tanımlayabilirsiniz.

Artık ortama bağlı olarak, bu özellik dosyalarından biri, ServletContextListener gibi, başlangıçta çağrılan dinleyicilerden birinde okunabilir.

Özellik dosyası, çeşitli anahtarlar için ortama özgü değerleri içerecektir.

Örnek "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

Örnek "production.properties"

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
db.dataSource.password=safasf@mn

Bu özellikler dosyasını kullanmak için, aşağıda belirtildiği gibi REsource'tan yararlanabilirsiniz.

        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, yerel ve üretim ortamı için uygun değerlere sahip ortam değişkeni olarak tanımlanabilir.

Bu değişikliklerle, appplicationContext.xml aşağıdaki değişiklikleri içerecektir

<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}" />

Bu yardımcı olur umarım .


1

@ Yiling'e teşekkürler. Bu bir ipucuydu.

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

Bundan sonra, 'FILE_PATH' adında bir ortam değişkeniniz olmalıdır. Bu ortam değişkenini oluşturduktan sonra terminalinizi / IDE'nizi yeniden başlattığınızdan emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.