如何在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”。