使用Spring Value批注覆盖环境变量

时间:2016-11-14 18:31:53

标签: java spring spring-bean

我在属性文件中设置我的oracle环境变量属性,如下所示:

oracle.home=XXX
file.path=C:\workspace

我正在使用spring工厂bean注释,我在类中声明了oracle Home:

@Value("${oracle.home}") private String oracleHome; //becomes YYY

我的所有其他属性都被正确读入,但oracleHome覆盖了我在我的环境中设置的内容(例如ORACLE_HOME),而没有从属性文件中读取..

为什么会发生这种情况,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

OS环境变量的排列顺序高于.properties文件。 大多数操作系统都不允许使用句点分隔的键名,因此spring会自动将您的proprety名称从ORACLE_HOME映射到oracle.home。你可以在这里阅读更多内容:

Properties considering order

答案 1 :(得分:1)

您可以控制属性占位符永远不会检查系统属性并使用属性文件中的键/值覆盖。

有3个可用值

  • SYSTEM_PROPERTIES_MODE_FALLBACK - 如果没有,请检查系统属性 可在指定属性中解析。
  • SYSTEM_PROPERTIES_MODE_NEVER - 从不检查系统属性。
  • SYSTEM_PROPERTIES_MODE_OVERRIDE - 先检查系统属性 尝试指定的属性。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html

<context:property-placeholder location="classpath:foo.properties">
<property name="systemPropertiesModeName">
    <value>SYSTEM_PROPERTIES_MODE_NEVER</value>
</property>
</context>

       @Bean
       public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
          PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer();
          p.setLocation("..")
          p.setSystemPropertiesMode(SYSTEM_PROPERTIES_MODE_NEVER);
          return p;
       }