如何在Spring应用程序Context中读取JVM参数.xml

我有一个带有Spring的JSF Web应用程序,我试图找出一种方法来引用应用程序Context.xml中的JVM参数。我从环境参数(例如-Denv=development)开始JVM。我发现并尝试了几种不同的方法,包括:

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

但是,当在 MyClass 中调用 setter 方法时,将传递字符串“${environment}”,而不是“development”。我有一个使用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" />

答案 1

您可以使用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


答案 2

如果注册 PropertyPlaceholderConfigurer,它将使用系统属性作为回退。

例如,添加

<context:property-placeholder/>

添加到您的配置中。然后,您可以在 XML 配置或批注中使用。${environment}@Value


推荐