春季启动application.properties不会被覆盖

时间:2018-07-06 13:03:30

标签: spring-boot

我上一堂课

package com.example.propertyorder;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@SpringBootApplication
@PropertySource(value="file:C:\\TEMP\\property-order.properties", ignoreResourceNotFound = true)

public class PropertyOrderApplication {


    public static void main(String[] args) {

        ConfigurableApplicationContext run = SpringApplication.run(PropertyOrderApplication.class, args);
        Environment env = (Environment) run.getBean("environment");
        System.out.println(env.getProperty("my.value"));
        System.out.println(env.getProperty("my.value2"));
    }
}

我有一个application.properties文件:

my.value=application.properties

,我有我的外部属性文件C:\\TEMP\\property-order.properties

my.value=property-order.properties
my.value2=gotcha

但结果始终是:

application.properties
gotcha

代替:

property-order.properties
gotcha

如此看来,spring-boot的application.properties否决了所有内容。 有没有办法解决它。 我发现的唯一解决方案是不使用application.properties,而是使用my-app.properties并将其放置在ProperySource-tree中我的外部文件之前:

@PropertySource(value="classpath:my-app.properties")
@PropertySource(value="file:C:\\TEMP\\property-order.properties", ignoreResourceNotFound = true)

有没有更好的方法,这样我就可以留在application.properties了?

编辑:

将缺少的value2添加到属性文件中

2 个答案:

答案 0 :(得分:1)

实际行为符合Spring Boot documentation

  

Spring Boot使用一个非常特殊的PropertySource顺序,即   旨在合理地覆盖价值。属性是   按以下顺序考虑:

     

....

     

14。打包的jar之外的应用程序属性(application.properties和YAML变体)。

     

15。打包在jar中的应用程序属性(application.properties和YAML变体)。

     

@Configuration类上的16. @ PropertySource批注。

application.properties(在jar的内部或外部)的优先级(分别为14和15)比在@PropertySource类(16)中添加的任何@Configuration注释的优先级更高。

  

是否有更好的方法,以便我可以继续   application.properties?

您当然可以使用13种优先级更高的方法之一:

  

1.Devtools主目录上的全局设置属性   (在devtools处于活动状态时,〜/ .spring-boot-devtools.properties)。

     

2. @ TestPropertySource在测试中的注释。

     测试中的

3. @ SpringBootTest#properties批注属性。命令   行参数。

     

4。来自SPRING_APPLICATION_JSON的属性(嵌入到   环境变量或系统属性)。

     

5.ServletConfig初始化参数。

     

6.ServletContext初始化参数。

     

来自java:comp / env的7.JNDI属性。

     

8.Java系统属性(System.getProperties())。

     

9.OS环境变量。

     

10。一个RandomValuePropertySource,仅具有随机属性。*。

     

11。打包的jar之外的特定于配置文件的应用程序属性   (application- {profile} .properties和YAML变体)。

     

12。打包在jar中的特定于配置文件的应用程序属性   (application- {profile} .properties和YAML变体)。

     

13。打包好的jar之外的应用程序属性   (application.properties和YAML变体)。

例如将property-order.properties重命名为application-order.properties以使其成为Spring Boot配置文件属性,并以order作为活动配置文件运行您的应用程序将为其赋予更高的优先级,因此应该足够:

@SpringBootApplication
public class PropertyOrderApplication {...}

答案 1 :(得分:1)

如果要覆盖application.properties中定义的属性,则可以使用以下方法。

@PropertySources({
        @PropertySource(value = "classpath:application.properties"),
        @PropertySource(value = "file:/user/home/external.properties", ignoreResourceNotFound = true)
})
public class Application {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

    }


}