Springboot:配置相关说明

发布于 2023-09-21  1186 次阅读


1. 配置优先级


Spring Boot 允许将配置外部化,以便可以在不同的环境中使用相同的应用程序代码。
我们可以使用各种外部配置源,包括Java Properties文件、YAML文件、环境变量和命令行参数。
@Value可以获取值,也可以用@ConfigurationProperties将所有属性绑定到java object中
以下是 SpringBoot 属性源加载顺序。后面的会覆盖前面的值。由低到高,高优先级配置覆盖低优先级

  1. 默认属性(通过SpringApplication.setDefaultProperties指定的)
  2. @PropertySource指定加载的配置(需要写在@Configuration类上才可生效)
  3. 配置文件(application.properties/yml等)
  4. RandomValuePropertySource支持的random.*配置(如:@Value("${random.int}"))
  5. OS 环境变量
  6. Java 系统属性(System.getProperties())
  7. JNDI 属性(来自java:comp/env)
  8. ServletContext 初始化参数
  9. ServletConfig 初始化参数
  10. SPRING_APPLICATION_JSON属性(内置在环境变量或系统属性中的 JSON)
  11. 命令行参数
  12. 测试属性。(@SpringBootTest进行测试时指定的属性)
  13. 测试类@TestPropertySource注解
  14. Devtools 设置的全局属性。($HOME/.config/spring-boot)

    结论:配置可以写到很多位置,常见的优先级顺序:
    ● 命令行 > 配置文件 > springapplication配置

配置文件优先级如下:(后面覆盖前面)

  1. jar 包内的application.properties/yml
  2. jar 包内的application-{profile}.properties/yml
  3. jar 包外的application.properties/yml
  4. jar 包外的application-{profile}.properties/yml

    建议:用一种格式的配置文件。如果.properties和.yml同时存在,则.properties优先

    结论:包外 > 包内; 同级情况:profile配置 > application配置

    所有参数均可由命令行传入,使用--参数项=参数值,将会被添加到环境变量中,并优先于配置文件。
    比如java -jar app.jar --name="Spring",可以使用@Value("${name}")获取

演示场景:
●包内: application.properties server.port=8000
●包内: application-dev.properties server.port=9000
●包外: application.properties server.port=8001
●包外: application-dev.properties server.port=9001


启动端口?:命令行 > 9001 > 8001 > 9000 > 8000

2. 外部配置


SpringBoot 应用启动时会自动寻找application.properties和application.yaml位置,进行加载。顺序如下:(后面覆盖前面)

  1. 类路径: 内部
    a 类根路径
    b 类下/config包
  2. 当前路径(项目所在的位置)
    a 当前路径
    b 当前下/config子目录
    c /config目录的直接子目录

最终效果:优先级由高到低,前面覆盖后面
●命令行 > 包外config直接子目录 > 包外config目录 > 包外根目录 > 包内目录
●同级比较:
○profile配置 > 默认配置
○properties配置 > yaml配置

规律:最外层的最优先。
●命令行 > 所有
●包外 > 包内
●config目录 > 根目录
●profile > application
配置不同就都生效(互补),配置相同高优先级覆盖低优先级


3.导入配置


使用spring.config.import可以导入额外配置
无论以上写法的先后顺序,my.properties的值总是优先于直接在文件中编写的my.property。

4.属性占位符


配置文件中可以使用 ${name:default}形式取出之前配置过的值。

注:参考自雷丰阳老师笔记


欢迎欢迎~热烈欢迎~