Spring值注入 - 如果没有env变量则默认为来自file的系统属性

时间:2014-08-06 14:41:18

标签: java spring spring-el

我正在寻找一种从环境变量到pojo注入值的简洁方法,但是使用未设置env变量的默认值。我知道这个语法:

@Value("#{systemProperties['JDBC_CONNECTION_STRING'] ?: \"jdbc:mysql://localhost:3306/mydb?user=root\"}")

但这意味着我必须在java文件中硬编码默认值。我宁愿在属性文件中使用它。有可能吗?

我需要这个,因为在AWS EBS上,env变量只是传递属性的方法,但我们不在那里部署。在其他地方,我想从文件中读取道具。

1 个答案:

答案 0 :(得分:5)

在spring.xml配置文件中添加以下内容:

<context:property-placeholder order="-50"/>

然后

<context:property-placeholder order="0" location="classpath:x.y.z/application.properties"/>      

第一个property-placholder将从系统属性加载所有值,第二个将从属性文件加载。

请注意系统属性的顺序是如何比应用程序属性少一个,因此系统属性优先。

现在在您的课程文件中,您只需执行此操作:

@Value("${JDBC_CONNECTION_STRING}")
private String jdbcConnectionString

它将从系统属性(如果存在)和应用程序属性(如果它不在系统属性中)中注入值。

我还想做的是另一个属性文件,我从S3加载,其顺序介于上述两个之间,因此我可以覆盖默认值。