如何在Spring applicationContext.xml中读取JVM参数

我有一个使用Spring的JSF Web应用程序,我正在尝试找出一种从applicationContext.xml引用JVM参数的方法。 我使用环境参数启动JVM(例如-Denv = development)。 我找到并尝试了一些不同的方法,包括:

  ${environment}   

但是,当在MyClass中调用setter方法时,将传递字符串“$ {environment}”,而不是“development”。 我有一个使用System.getProperty()的工作,但是能够通过Spring设置这些值会更好,更清晰。 有没有办法做到这一点?

编辑:我之前应该提到的是我使用JDBC连接从我的数据库加载属性。 这似乎增加了复杂性,因为当我向配置添加属性占位符时,属性占位符将覆盖从数据库加载的属性。 我不确定它是依赖于顺序还是其他东西。 这就像我可以做其中一个,但不是两个。

编辑:我目前正在使用以下配置加载属性:

            

你可以使用Spring EL表达式,然后它是#{systemProperties.test} -Dtest="hallo welt" #{systemProperties.test} for -Dtest="hallo welt"

在你的情况下它应该是:

   #{systemProperties.environment}   

#而不是$是没错的!

$表示占位符,而#表示bean,而systemProperties是bean。


可能只是拼写错误,但可能是您的问题的原因:在命令行语句的示例中,您将变量命名为env

-Denv=development ,例如…

但在弹簧配置中,您将其命名为environment 。 但两者当然必须是平等的!

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

例如,添加

  

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

您可以根据系统属性env加载属性文件,如下所示:

        classpath:myapp-${env:prod}.properties    

如果未将env设置为默认生产,否则开发和测试团队可以通过设置-Denv=development-Denv=testing相应的测试来获得应用程序的风格。

使用#{systemProperties [‘env’]}基本上将Java命令行中使用的propertyName作为-DpropertyName = value传递。 在这种情况下,它是-Denv =开发所以使用环境。

有趣的是,Spring已经发展到使用PropertySources更优雅地处理这种需求: http : //spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/

如果您正在使用Web应用程序,可以使用一些配置和自定义ApplicationInitializer,您可以使用属性占位符处理系统,环境和自定义属性。 Spring提供了PropertySourcesPlaceholderConfigurer,它在你的Spring配置中使用。 那个会在你的属性文件中寻找属性,然后是System,然后是环境。

Spring 3.0.7

  

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

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