前言
之前就想搞清楚在SpringBoot属性配置的优先级是怎么样的,虽然尝试过google或者百度,但总感觉不全,今天翻了一下SpringBoot的官方文档,刚好就找到了,就顺便记录了一下。
SpringBoot Version:2.1.13
官方文档:https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-external-config.html
属性配置优先级
优先级从上到下依次递减:
- Devtools全局配置(
~/.spring-boot-devtools.properties
) - @TestPropertySource 注解中的测试配置
- 测试环境中的
properties
,在@SpringBootTest和测试注释上可用,用于测试应用程序的特定部分。 - 命令行参数。
- SPRING_APPLICATION_JSON
- ServletConfig初始化参数
- ServletContext初始化参数
- JNDI属性(
java:comp/env
) - Java系统环境(
System.getProperties()
) - 操作系统环境变量
- 随机源设置的属性(
random.*
) - jar包外的
application-{profile}.properties
>application-{profile}.yml
- jar包内的
application-{profile}.properties
>application-{profile}.yml
- jar包外的
application.properties
>application.yml
- jar包内的
application.properties
>application.yml
- @PropertySource绑定的属性。
- 默认配置(
SpringApplication.setDefaultProperties
)
实验代码
挑三个简单的配置方法来试试上面所说的优先级是否是真的:
默认配置
Java代码
TestCommandLineRunner.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
public class TestCommandLineRunner implements CommandLineRunner{
@Autowired
private Environment env;
@Override
public void run(String... args) throws Exception {
System.out.println(env.getProperty("404.url"));
}
}
Sb2Application.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.Properties;
@SpringBootApplication
public class Sb2Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Sb2Application.class);
Properties properties = new Properties();
properties.setProperty("404.url", "https://www.google.com-setDefaultProperties");
springApplication.setDefaultProperties(properties);
springApplication.run(args);
}
控制台输出
https://www.google.com-setDefaultProperties
@PropertySource绑定的属性
Java代码
在上面的代码基础之上改造:
Sb2Application.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
import java.util.Properties;
@SpringBootApplication
@PropertySource({"demo.properties"})
public class Sb2Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Sb2Application.class);
Properties properties = new Properties();
properties.setProperty("404.url", "https://www.google.com-setDefaultProperties");
springApplication.setDefaultProperties(properties);
springApplication.run(args);
}
配置文件
在resources目录下添加如下配置:
demo.properties
404.url=https://www.google.com-demo.properties
控制台输出
https://www.google.com-demo.properties
- 可见
@PropertySource
优先级确实比setDefaultProperties
高。
jar包内部application.yml
配置文件
在上面代码的基础上在resources目录下添加如下文件:
application.yml
404:
url: https://www.google.com-application.yml
控制台输出
https://www.google.com-application.yml
- 说明
jar包内部application.yml
优先级大于``
jar包内部application.properties
配置文件
在上面代码的基础上添加如下配置文件:
application.properties
404.url=https://www.google.com-application.properties
控制台输出
https://www.google.com-application.properties
- 说明
jar包内部application.properties
优先级大于jar包内部application.yml
,这一点是官方文档没有说明的。
剩余的优先级我也都测试过了,官方的给出的优先级是成立的,只是全都贴出来可能显得比较杂乱,干脆就不贴了,有兴趣的可以自己写写demo或者找找SpringBoot相关单元测试来实验。