2011-04-08 92 views
20

我有一个JSF Web应用程序和Spring,我想弄清楚从applicationContext.xml引用JVM参数的方法。我使用环境参数(例如-Denv = development)启动JVM。我已经找到并尝试了几种不同的方法,包括:如何阅读Spring应用程序中的JVM参数applicationContext.xml

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

但是,当setter方法MyClass中被调用时,字符串“$ {}环境”传递的,而不是“发展”。我有一个适当的工作来使用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" /> 

回答

26

您可以使用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。但两者必须是当然的平等!

+0

我使用这种方法得到了相同的结果,因为我在示例中使用了该方法。字符串“#{systemProperties.environment}”是传递给setter方法的东西。 – jinxed 2011-04-11 16:07:09

+0

@jinxed:我认为我发现了最后一个问题,那里是拼写错误。 - 看到我的扩展答案。 – Ralph 2011-04-12 06:53:45

10

如果您注册一个PropertyPlaceholderConfigurer,它将使用系统属性作为后备。

例如,添加

<context:property-placeholder/> 

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

+0

当我将其添加到配置中时,我从数据库加载的属性被此属性占位符覆盖。编辑原始描述。 – jinxed 2011-04-11 17:27:40

+0

数据库属性是如何加载的?它们是PropertyPlaceholderConfigurer配置的一部分吗? – sourcedelica 2011-04-11 17:45:07

+0

它们通过JDBC使用问题(上面)中显示的配置加载... – jinxed 2011-04-11 20:27:51

3

可以加载基于系统属性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有自己的应用程序的味道因此。

+0

再次阅读主题。这些属性正在从数据库中加载。问题是,如何在配置的其他地方使用JVM参数? – jinxed 2011-04-11 22:05:31

+0

这就是我在你的问题中看到的:'我用一个环境参数(例如-Denv = development)启动JVM'我也在你提到的编辑问题中提到你正在从DB读取一些属性。是否有限制,只能从1个源读取属性? – anubhava 2011-04-11 22:15:48

+0

所有属性都从数据库加载。我理解使用PropertyPlaceholderConfigurer来引入JVM参数的概念,但是当我使用PropertyPlaceholderConfigurer时,已经成功加载的数据库属性现在缺失。 – jinxed 2011-04-11 22:24:29

0

有趣的是,春天更优雅演变为处理这一需要,PropertySources: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/

少数配置,也许定制ApplicationInitializer如果你是一个Web应用程序,则可以有属性占位符手柄系统,环境和自定义属性。 Spring提供了PropertySourcesPlaceholderConfigurer,当你在你的Spring配置文件中使用它。那个人会在你的属性文件中寻找属性,然后是系统,最后是环境。

0

春3.0.7

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

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

如果没有设置 “ENV” 将使用默认的 “config-prd.properties”。

1

使用#{systemProperties['env']} 基本上通过在Java命令行用作-DpropertyName=valuepropertyName。在这种情况下,它是如此使用env的-Denv=development

相关问题