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 中调用 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" />
4

6 回答 6

27

你可以使用 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例如...

但是在 spring 配置中,您可以命名它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,您可以让属性占位符处理 System、Environment 和自定义属性。Spring 提供了在 Spring 配置中使用的 PropertySourcesPlaceholderConfigurer。那将在您的属性文件中查找属性,然后是系统,最后是环境。

于 2015-05-03T21:23:10.300 回答
0

春天 3.0.7

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

并在运行时设置:-Denv=config-dev.properties

如果未设置“env”将使用默认的“config-prd.properties”。

于 2015-09-16T15:16:25.863 回答