web-dev-qa-db-ja.com

Spring applicationContext.xmlでJVM引数を読み取る方法

SpringのJSF Webアプリケーションがあり、applicationContext.xmlからJVM引数を参照する方法を見つけようとしています。 JVMを環境引数(-Denv = developmentなど)で開始しています。私はいくつかの異なるアプローチを見つけて試しました:

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

ただし、MyClassでセッターメソッドが呼び出されると、「開発」ではなく文字列「$ {environment}」が渡されます。 System.getProperty()を使用するための回避策がありますが、Springを介してこれらの値を設定できるようにすると、より適切でクリーンになります。これを行う方法はありますか?

編集:前に言っておくべきことは、JDBC接続を使用してデータベースからプロパティをロードしているということです。プロパティプレースホルダーを構成に追加すると、データベースから読み込まれたプロパティがプロパティプレースホルダーによってオーバーライドされるため、これにより複雑さが増すようです。それが順序に依存するのか何かなのかわかりません。どちらか一方しかできませんが、両方はできません。

編集:私は現在、次の構成を使用してプロパティをロードしています:

<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" />
20
jinxed

あなたはSpring EL式を使うことができ、それは#{systemProperties.test} ために -Dtest="hallo welt"

あなたの場合、それは:

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

# の代わりに $は間違いありません!

$はプレースホルダーを参照しますが、#は豆を指し、systemPropertiesは豆です。


単なるスペルエラーである可能性がありますが、それが問題の原因である可能性があります。コマンドラインステートメントの例では、変数にenvという名前を付けます

-Denv=development、 例えば...

ただし、春の構成では、environmentという名前を付けます。しかし、どちらももちろん同等でなければなりません!

27
Ralph

PropertyPlaceholderConfigurerを登録すると、システムプロパティがフォールバックとして使用されます。

たとえば、

<context:property-placeholder/>

あなたの構成に。次に、${environment} XML構成または@Valueアノテーション。

10
sourcedelica

次のように、システムプロパティenvに基づいてプロパティファイルをロードできます。

   <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がデフォルトに設定されていない場合は本番環境に設定します。それ以外の場合は、-Denv=developmentまたは-Denv=testingそれに応じて。

4
anubhava

#{systemProperties['env']}を使用します。基本的に、Javaコマンドラインで使用されるpropertyNameを-DpropertyName=valueとして渡します。この場合は-Denv=developmentだったので、envを使用しました。

1
Amit M

春3.0.7

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

実行時に設定:-Denv = config-dev.properties

設定されていない場合、「env」はデフォルトの「config-prd.properties」を使用します。

0
disciolli

興味深いことに、SpringはPropertySourcesでこの必要性をより適切に処理するように進化しました: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/ =

いくつかの構成と、おそらくWebアプリケーションで作業している場合はカスタムのApplicationInitializerを使用すると、プロパティプレースホルダーでシステム、環境、およびカスタムプロパティを処理できます。 Springは、Spring設定で使用する場合に使用されるPropertySourcesPlaceholderConfigurerを提供します。それはあなたのプロパティファイル、それからシステム、そして最後に環境でプロパティを探します。

0
Chris J