Blogger Information
Blog 41
fans 0
comment 0
visits 25295
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
10、【网摘】Spring Boot配置加载顺序
自由之上
Original
921 people have browsed it

前言

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 指定的默认属性

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

1、命令行参数

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

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

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

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

命令行参数说明如下:

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

2、配置文件

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

图 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
创建一个名为 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

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

  1. mvn clean package

2、在 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 #激活开发环境配置

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

  1. java -jar mybootdemo-0.0.1-SNAPSHOT.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”。

加入
QQ群:722461036
微信群:
一起督促、学习、练习、温习、复习 ~ ~ ~

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post