我上一堂课
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添加到属性文件中
答案 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);
}
}