21

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

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

ただし、MyClass でセッター メソッドが呼び出されると、「development」ではなく、文字列「${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" />
4

6 に答える 6

27

#{systemProperties.test}Spring EL 式を使用できます。-Dtest="hallo welt"

あなたの場合、次のようになります。

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

#代わりになる$こと間違いなし!

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


単なるスペルミスかもしれませんが、それが問題の原因かもしれません: コマンドラインステートメントの例では、変数に名前を付けますenv

( -Denv=development、たとえば...

しかし、春の構成では、名前を付けますenvironment。もちろん、どちらも同じでなければなりません。

于 2011-04-08T16:58:10.507 に答える
10

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

たとえば、追加

<context:property-placeholder/>

あなたの構成に。次に${environment}、XML 構成または@Value注釈のいずれかで使用できます。

于 2011-04-08T17:22:48.630 に答える
4

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

于 2011-04-11T21:45:30.233 に答える
1

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

于 2015-11-24T04:51:09.720 に答える
0

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

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

于 2015-05-03T21:23:10.300 に答える