• 10. Spring Boot配置加载顺序


    Spring Boot 不仅可以通过配置文件进行配置,还可以通过环境变量、命令行参数等多种形式进行配置。这些配置都可以让开发人员在不修改任何代码的前提下,直接将一套 Spring Boot  应用程序在不同的环境中运行。

    Spring Boot 配置优先级

    以下是常用的 Spring Boot 配置形式及其加载顺序(优先级由高到低):

    1. 命令行参数
    2. 来自 java:comp/env 的 JNDI 属性
    3. Java 系统属性(System.getProperties())
    4. 操作系统环境变量
    5. RandomValuePropertySource 配置的 random.* 属性值
    6. 配置文件(YAML 文件、Properties 文件)
    7. @Configuration 注解类上的 @PropertySource 指定的配置文件
    8. 通过 SpringApplication.setDefaultProperties 指定的默认属性


    以上所有形式的配置都会被加载,当存在相同配置内容时,高优先级的配置会覆盖低优先级的配置;存在不同的配置内容时,高优先级和低优先级的配置内容取并集,共同生效,形成互补配置。

    命令行参数

    Spring Boot 中的所有配置,都可以通过命令行参数进行指定,其配置形式如下。

     
    
    • java -jar {Jar文件名} --{参数1}={参数值1} --{参数2}={参数值2}

    示例 1

    1. 在 springbootdemo  项目启动时,使用以下命令。

     
    
    • java -jar springbootdemo-0.0.1-SNAPSHOT.jar --server.port=8081 --server.servlet.context-path=/bcb


    命令行参数说明如下:

    • --server.port:指定服务器端口号;
    • --server.servlet.context-path:指定上下文路径(项目的访问路径)。


    执行结果如下图。
     


    图1:Spring Boot 指定命令行参数

    配置文件

    Spring Boot 启动时,会自动加载 JAR 包内部及 JAR 包所在目录指定位置的配置文件(Properties 文件、YAML 文件),下图中展示了 Spring Boot 自动加载的配置文件的位置及其加载顺序,同一位置下,Properties 文件优先级高于 YAML 文件。
     


    图2:Spring Boot 配置文件加载位置及优先级

     
    图 2 说明如下:

    • /myBoot:表示 JAR 包所在目录,目录名称自定义;
    • /childDir:表示 JAR 包所在目录下 config 目录的子目录,目录名自定义;
    • JAR:表示 Spring Boot 项目打包生成的 JAR;
    • 其余带有“/”标识的目录的目录名称均不能修改。
    • 红色数字:表示该配置文件的优先级,数字越小优先级越高。


    这些配置文件得优先级顺序,遵循以下规则:

    1. 先加载 JAR 包外的配置文件,再加载 JAR 包内的配置文件;
    2. 先加载 config 目录内的配置文件,再加载 config 目录外的配置文件;
    3. 先加载 config 子目录下的配置文件,再加载 config 目录下的配置文件;
    4. 先加载 appliction-{profile}.properties/yml,再加载 application.properties/yml;
    5. 先加载 .properties 文件,再加载 .yml 文件。

    示例 2

    1. 创建一个名为 mybootdemo 的 Spring Boot 项目,并在 src/main/resoources 下创建以下 4 个配置文件。

    • application.yml:默认配置
    • application-dev.yml:开发环境配置
    • application-test.yml:测试环境配置
    • application-prod.yml:生产环境配置


    1)在 applcation.yml 文件中,指定默认服务端口号(port)为 “8080”,上下文路径(context-path)为“/mybootdemo”,并激活开发环境(dev)的 profile。

    1. server:
    2. port: 8080 #端口号
    3. servlet:
    4. context-path: /mybootdemo #上下文路径或项目访问路径
    5. spring:
    6. profiles:
    7. active: dev #激活开发环境配置

    2)在 application-dev.yml 中,指定开发环境端口号为 “8081”,上下文路径为“/in-dev”,配置如下。

    1. server:
    2. port: 8081 #开发环境端口号 8081
    3. servlet:
    4. context-path: /in-dev #开发环境上下文路径为 in-dev
    5. spring:
    6. config:
    7. activate:
    8. on-profile: dev #开发环境

    3)在 application-test.yml 中,指定测试环境端口号为 “8082”,上下文路径为“/in-test”,配置如下。

    1. #测试环境配置
    2. server:
    3. port: 8082 #测试环境端口 8082
    4. servlet:
    5. context-path: /in-test #测试环境上下文路径 /in-test
    6. spring:
    7. config:
    8. activate:
    9. on-profile: test

    4)在 application-prod.yml 中,指定生产环境端口号为 “8083”,上下文路径为“/in-prod”,配置如下。

    1. #生产环境配置
    2. server:
    3. port: 8083 #端口号
    4. servlet:
    5. context-path: /in-prod #上下文路径
    6. spring:
    7. config:
    8. activate:
    9. on-profile: prod

    2. 执行以下 mvn 命令,将 mybootdemo 打包成 JAR,并将该 JAR 包移动到本次磁盘的某个目录下(例如 mySpringBoot 目录)。

    mvn clean package

    3. 在 JAR 包所在目录下创建 application.yml ,并设置上下文路径为“/out-default”,并激活生产环境(prod)Profile。

    1. #JAR 包外默认配置
    2. server:
    3. servlet:
    4. context-path: /out-default
    5. #切换配置
    6. spring:
    7. profiles:
    8. active: prod #激活开发环境配置

    4. 打开命令行窗口,跳转到 mySpringBoot 目录下,执行以下命令启动 Spring Boot。

    java -jar mybootdemo-0.0.1-SNAPSHOT.jar

    启动结果如下图。
     


    图3:Spring Boot 使用 JAR 包外配置启动

    示例分析:

    • Spring Boot 在启动时会加载全部的 5 个配置文件,其中位于 JAR 包外的 application.yml 优先级最高;
    • 在 JAR 包外的 application.yml 中,配置激活了生产环境(prod)Profile,即 JAR 包内部的 application-prod.yml 生效。此时,该项目中的配置文件优先级顺序为:JAR 包外 application.yml > JAR 包内 application-prod.yml >JAR 包内其他配置文件;
    • application-prod.yml 的配置内容会覆盖 JAR 包内所有其他配置文件的配置内容,即端口号(port)为“8083”,上下文路径(context-path)为“/in-prod”;
    • JAR 包内的 application-prod.yml 中的上下文路径会被 JAR 包外的 application.yml 覆盖为“/out-default”;
    • JAR 包内的 application-prod.yml 与 JAR 包外的 application.yml,形成互补配置,即,端口号为“8083”,上下文路径为“/out-default”。

     

  • 相关阅读:
    利用CloudCompare进行点云过滤去噪(统计滤波)
    历时7天,四名学生将《水浒传》搬到线上!
    手撕AVL树 (C++ 实现)
    WindowsNT下的OpenGL
    “干翻”GPT-3,Meta 用开源发起攻势
    Dockerfile执行的时候没有执行CMD
    【机器学习】拟合优度度量和梯度下降(红酒数据集的线性回归模型sklearn&Ridge)
    次小生成树(lca+Kruskal)
    Spark Structured Streaming 2021年最新进展的总结
    top命令应用(查看进程实时动态信息)
  • 原文地址:https://blog.csdn.net/tiger00598/article/details/125477272