Spring如何知道要引用哪个属性文件以获取以@Value注释的变量的值?

时间:2018-07-05 13:32:33

标签: spring spring-boot

如果我们的应用程序中有多个属性文件,并且两个文件都设置了具有不同值的变量,该怎么办?

我们通常只是按如下所示注入值,并且它总是设法以某种方式获取值表单属性文件。怎么样?

@Configuration
public class AppConfig {    
    @Value("${spring.datasource.url}")
    private String datasourceUrl;

2 个答案:

答案 0 :(得分:2)

Spring读取的最后一个文件中的值将覆盖所有先前读取的值。如果您定义自己读取文件的顺序(例如,通过配置),则您将无法完全控制文件。看看下面的例子:

基于注释的配置:

@Configuration
@PropertySource({"classpath:foo.properties", "classpath:bar.properties"})
public class PropertiesWithJavaConfig {
//...
}

基于XML的配置:

<context:property-placeholder location="classpath:foo.properties,classpath:bar.properties"/>

如果bar.properties包含也在foo.properties中定义的属性,则bar.properties中的值将覆盖foo.properties中的值。

答案 1 :(得分:1)

Spring Boot has many possible sources of configuration

关于属性文件,它先检查application.properties,然后再检查application-<active_profile>.properties,其中<active_profile>spring.profiles.active环境变量设置(*.yaml也是这样)文件)。

它将在以下优先级的以下目录中搜索应用以上规则的属性文件:
(在列表的上方会覆盖从较低位置加载的属性)

    当前目录的
  • /config子目录
  • 当前./目录
  • classpath的/config包(如果使用maven,则src/main/resources/config中的所有内容)
  • classpath的根/(如果使用maven,则src/main/resources中的所有内容)