2011-04-08 4 views
20

Spring과 함께 JSF 웹 응용 프로그램을 가지고 있으며 applicationContext.xml에서 JVM 인수를 참조하는 방법을 찾으려고합니다. 환경 변수 (예 : -Denv = development)를 사용하여 JVM을 시작합니다. 내가 발견 등 몇 가지 다른 방법을 시도 : setter 메소드가 MyClass에의 호출Spring applicationContext.xml의 JVM 인수를 읽는 방법

<bean id="myBean" class="com.foo.bar.myClass"> 
    <property name="environment"> 
    <value>${environment}</value> 
    </property> 
</bean> 

하지만은, 문자열 "$ {환경}"대신 "개발"로, 전달됩니다. 나는 System.getProperty()를 사용하기위한 작업을하고 있지만 Spring을 통해이 값들을 설정할 수 있도록 더 좋고 깨끗합니다. 이 일을 할 수있는 방법이 있습니까?

편집 : 이전에 언급 했어야 할 것은 JDBC 연결을 사용하여 데이터베이스에서 속성을로드한다는 것입니다. 내 구성에 속성 자리 표시자를 추가하면 데이터베이스에서로드 된 속성이 속성 자리 표시 자에 의해 무시되므로 복잡성이 추가되는 것 같습니다. 그것이 주문에 의존적인지 또는 어떤 것인지 확실하지 않습니다. 그것은 내가 할 수있는 것과 같지만 둘 다 할 수는 없다.

편집 : 나는 현재 다음과 같은 구성하여 속성을로드하고 있습니다 : 귀하의 경우 -Dtest="hallo welt"

에 대한

<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="jdbc.mydb.myschema"/> 
</bean> 

<bean id="props" class="com.foo.bar.JdbcPropertiesFactoryBean"> 
    <property name="jdbcTemplate"> 
     <bean class="org.springframework.jdbc.core.JdbcTemplate"> 
      <constructor-arg ref="myDataSource" /> 
     </bean> 
    </property> 
</bean> 

<context:property-placeholder properties-ref="props" /> 

답변

26

당신은 봄 EL 표현식을 사용할 수 있습니다, 다음은 #{systemProperties.test}를이해야한다 :

<bean id="myBean" class="com.foo.bar.myClass"> 
    <property name="environment"> 
    <value>#{systemProperties.environment}</value> 
    </property> 
</bean> 

# 대신 $은 실수가 아닙니다! # 콩을 의미하며, systemProperties가 빈 상태에서

$는 장소 홀더를 참조합니다.


월에만 맞춤법 오류입니다 수 있지만, 그것은 당신의 문제에 대한 원인 : 명령 행 문에 대한 예제에서는 예를 들어 변수 env

(-Denv=development을 이름을 지정합니다. ..

그러나 봄 구성

당신은 그것을 environment 이름을 지정합니다. 그러나 모두는 물론 동등해야합니다!

+0

필자는이 예에서 접근법을 사용하는 것과 같은 방식으로이 접근법을 사용합니다. "# {systemProperties.environment}"문자열은 setter 메서드에 전달되는 문자열입니다. – jinxed

+0

@jinxed : 나는 마지막 문제를 발견했다고 생각합니다. 맞춤법 오류가있었습니다. 내 확장 된 대답을 보라. – Ralph

10

PropertyPlaceholderConfigurer를 등록하면 시스템 등록 정보를 대체 시스템으로 사용합니다.

예를 들어, 구성에

<context:property-placeholder/> 

를 추가합니다. 그런 다음 XML 구성이나 @Value 주석에서 ${environment}을 사용할 수 있습니다.

+0

이것을 구성에 추가하면 데이터베이스에서로드 한 속성이이 속성 자리 표시 자에 의해 무시됩니다. 수정 된 원본 설명. – jinxed

+0

데이터베이스 속성은 어떻게로드됩니까? 그것들은 PropertyPlaceholderConfigurer 구성의 일부입니까? – sourcedelica

+0

위의 질문에 표시된 구성을 사용하여 JDBC를 통해로드됩니다 ... – jinxed

3

이 같은 시스템 프로퍼티 env에 따라 속성 파일을로드 할 수 있습니다 : 생산, 그렇지 않으면 개발로 기본 설정되어 있지 및 테스트 팀은 -Denv=development 또는 -Denv=testing를 설정하여 응용 프로그램의 자신의 맛을 가질 수

<bean id="applicationProperties" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="ignoreResourceNotFound" value="false" /> 
     <property name="ignoreUnresolvablePlaceholders" value="true" /> 
     <property name="searchSystemEnvironment" value="false" /> 
     <property name="locations"> 
     <list> 
      <value>classpath:myapp-${env:prod}.properties</value> 
     </list> 
     </property> 
    </bean> 

env 경우 따라서.

+0

스레드를 다시 읽습니다. 속성은 DB에서로드됩니다. 질문은 구성의 다른 부분에서 JVM 인수를 어떻게 사용합니까? – jinxed

+0

이것은 당신의 질문에서 볼 수 있습니다.'환경 변수 (예 : -Denv = development)로 JVM을 시작합니다. '또한 편집 된 질문에서 DB에서 일부 속성을 읽는 중입니다. 하나의 소스에서만 속성을 읽을 수 있다는 제한이 있습니까? – anubhava

+0

모든 등록 정보가 데이터베이스에서로드됩니다. PropertyPlaceholderConfigurer를 사용하여 JVM 인수를 가져 오는 개념을 이해하지만, 성공적으로로드 된 DB 등록 정보가 PropertyPlaceholderConfigurer를 사용할 때 누락되었습니다. – jinxed

0

흥미롭게도, 봄이 PropertySources 더 우아하게 취급이 필요로 진화 : 몇 구성하고 웹 응용 프로그램에서 작업하는 경우 아마도 사용자 정의 ApplicationInitializer와 http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/

, 당신은 속성 자리 핸들 시스템을 가질 수 있습니다 , 환경 및 사용자 지정 속성 Spring은 Spring 설정에있을 때 사용되는 PropertySourcesPlaceholderConfigurer를 제공한다. 그러면 속성 파일에서 시스템을 찾은 다음 환경을 찾습니다. 3.0.7

<context:property-placeholder location="classpath:${env:config-prd.properties}" /> 

그리고 런타임 세트에서

0

봄 : -Denv = config-dev.properties

"ENV는"기본 "config-prd.properties"를 사용 설정하지 않으면

.

1

사용 #{systemProperties['env']} 기본적으로 -DpropertyName=value으로 Java 명령 줄에 사용 된 propertyName을 전달합니다. 이 경우에는이므로 env를 사용했습니다.

관련 문제