SpringBoot配置加载顺序

开课吧开课吧锤锤2021-08-12 11:50

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

SpringBoot配置加载顺序

SpringBoot配置优先级  

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

1、命令行参数  

2、来自java:comp/env的JNDI属性  

3、Java系统属性(System.getProperties())  

4、操作系统环境变量  

5、RandomValuePropertySource配置的random.*属性值  

6、配置文件(YAML文件、Properties文件)  

7、@Configuration注解类上的@PropertySource指定的配置文件  

8、通过SpringApplication.setDefaultProperties指定的默认属性  

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

命令行参数  

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

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

示例1  

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

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

命令行参数说明如下:  

--server.port:指定服务器端口号;  

--server.servlet.context-path:指定上下文路径(项目的访问路径)。  

执行结果如下图。  

SpringBoot配置加载顺序

配置文件  

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

SpringBoot配置加载顺序

图2说明如下:  

/myBoot:表示JAR包所在目录,目录名称自定义;  

/childDir:表示JAR包所在目录下config目录的子目录,目录名自定义;  

JAR:表示SpringBoot项目打包生成的JAR;  

其余带有“/”标识的目录的目录名称均不能修改。  

红色数字:表示该配置文件的优先级,数字越小优先级越高。  

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

1、先加载JAR包外的配置文件,再加载JAR包内的配置文件;  

2、先加载config目录内的配置文件,再加载config目录外的配置文件;  

3、先加载config子目录下的配置文件,再加载config目录下的配置文件;  

4、先加载appliction-{profile}.properties/yml,再加载application.properties/yml;  

5、先加载.properties文件,再加载.yml文件。  

示例2  

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

applcation.yml:默认配置  

application-dev.yml:开发环境配置  

application-test.yml:测试环境配置  

application-prod.yml:生产环境配置  

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

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

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

server:
  port: 8081 #开发环境端口号 8081
  servlet:
    context-path: /in-dev #开发环境上下文路径为 in-dev
spring:
  config:
    activate:
      on-profile: dev #开发环境

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

#测试环境配置
server:
  port: 8082 #测试环境端口 8082
  servlet:
    context-path: /in-test #测试环境上下文路径 /in-test
spring:
  config:
    activate:
      on-profile: test

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

#生产环境配置
server:
  port: 8083 #端口号
  servlet:
    context-path: /in-prod #上下文路径
spring:
  config:
    activate:
      on-profile: prod

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

mvn clean package

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

#JAR 包外默认配置
server:
  servlet:
    context-path: /out-default
#切换配置
spring:
  profiles:
    active: prod #激活开发环境配置

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

java -jar mybootdemo-0.0.1-SNAPSHOT.jar

java-jarmybootdemo-0.0.1-SNAPSHOT.jar  

启动结果如下图。  

SpringBoot配置加载顺序

示例分析:  

SpringBoot在启动时会加载全部的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”。  

以上就是开课吧广场小编为大家整理发布的“SpringBoot配置加载顺序”一文,更多Java教程相关内容尽在开课吧广场Java教程频道!

SpringBoot配置加载顺序

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
高并发编程训练营