前言

之前就想搞清楚在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

属性配置优先级

优先级从上到下依次递减:

  1. Devtools全局配置(~/.spring-boot-devtools.properties
  2. @TestPropertySource 注解中的测试配置
  3. 测试环境中的properties,在@SpringBootTest和测试注释上可用,用于测试应用程序的特定部分。
  4. 命令行参数。
  5. SPRING_APPLICATION_JSON
  6. ServletConfig初始化参数
  7. ServletContext初始化参数
  8. JNDI属性(java:comp/env
  9. Java系统环境(System.getProperties()
  10. 操作系统环境变量
  11. 随机源设置的属性(random.*
  12. jar包外的application-{profile}.properties > application-{profile}.yml
  13. jar包内的application-{profile}.properties > application-{profile}.yml
  14. jar包外的application.properties > application.yml
  15. jar包内的application.properties > application.yml
  16. @PropertySource绑定的属性。
  17. 默认配置(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相关单元测试来实验。