IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 11Springboot的默认配置文件和外部配置文件及加载顺序 -> 正文阅读

[Java知识库]11Springboot的默认配置文件和外部配置文件及加载顺序

默认配置文件

通常情况下,Spring Boot 在启动时会将 resources 目录下的 application.properties 或 apllication.yml 作为其默认配置文件,我们可以在该配置文件中对项目进行配置,但这并不意味着 Spring Boot 项目中只能存在一个 application.properties 或 application.yml。

Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。

Spring Boot 启动时会扫描以下 5 个位置的? application.properties 或 apllication.yml 文件,并将它们作为 Spring boot 的默认配置文件。

  1. file:./config/*/
  2. file:./config/
  3. file:./
  4. classpath:/config/
  5. classpath:/

注:file: 指当前项目根目录;classpath: 指当前项目的类路径,即 resources 目录。

以上所有位置的配置文件都会被加载,且它们优先级依次降低,序号越小优先级越高。其次,位于相同位置的 application.properties 的优先级高于 application.yml。

所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置,形成互补配置,即:

  • 存在相同的配置内容时,高优先级的内容会覆盖低优先级的内容;
  • 存在不同的配置内容时,高优先级和低优先级的配置内容取并集。

示例?

001、创建一个名为 springbootdemo 的 Spring Boot 项目,并在当前项目根目录下、类路径下的 config 目录下、以及类路径下分别创建一个配置文件 application.yml,该项目结构如下图。

002、项目根路径下配置文件 application.yml 配置如下。

#项目更目录下
#上下文路径为 /abc
server:
  servlet:
    context-path: /abc

003、项目类路径下 config 目录下配置文件 application.yml 配置如下。

#类路径下的 config 目录下
#端口号为8084
#上下文路径为 /helloWorld
server:
  port: 8084
  servlet:
    context-path: /helloworld

?004、项目类路径下的 application.yml 配置如下。

#默认配置
server:
  port: 8080

005、在 com.example.demo.controller 包下创建一个名为 MyController 的类,代码如下。

@RestController
public class MyController {
  @ResponseBody
  @RequestMapping("/test")
    public String hello() {
    return "hello Spring Boot!";
  }
}

006、启动 Spring Boot,查看控制台输出,如下图。

根据 Spring Boot 默认配置文件优先级进行分析:

  • 该项目中存在多个默认配置文件,其中根目录下?/config 目录下的配置文件优先级最高,因此项目的上下文路径为 “/abc”;
  • 类路径(classpath)下 config 目录下的配置文件优先级高于类路径下的配置文件,因此该项目的端口号为 “8084”;
  • 以上所有配置项形成互补,所以访问路径为“http://localhost:8084/abc”。

根据服务器端口和上下文路径,使用浏览器访问?http://localhost:8084/abc/test,结果如下图。


外部配置文件

Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。

? 除了默认配置文件,Spring Boot 还可以加载一些位于项目外部的配置文件。我们可以通过如下 2 个参数,指定外部配置文件的路径:

  • spring.config.location?
  • spring.config.additional-location?

01、spring.config.location

? ? ? ?我们可以先将 Spring Boot 项目打包成 JAR 文件,然后在命令行启动命令中,使用命令行参数 --spring.config.location,指定外部配置文件的路径。

  • java -jar {JAR} --spring.config.location={外部配置文件全路径}

? ? ? ?需要注意的是,使用该参数指定配置文件后,会使项目默认配置文件(application.properties 或 application.yml )失效,Spring Boot 将只加载指定的外部配置文件。

示例 1

001. 在本地目录 D:\myConfig 下,创建一个配置文件 my-application.yml,配置如下。

#指定配置文件
server:
  port: 8088

002. 执行以下 mvn 命令,将?springbootdemo 项目打包成 JAR。

mvn clean package

命令执行结果如下图。

003. 打开命令行窗口,跳转到 JAR 文件所在目录,执行以下命令,其中 --spring.config.location 用于指定配置文件的新位置。

  • java -jar springbootdemo-0.0.1-SNAPSHOT.jar --spring.config.location=D:\myConfig\my-application.yml

项目运行结果如下图。

?从控制台输出可以看出:

  • 服务器端口号从“8084”被修改为“8088”,表示外部配置文件已生效;
  • 上下文路径则从“/abc”被修改为默认值(‘ ’),表示项目内部的默认配置文件已失效。

004. 使用浏览器访问?“http://localhost:8088/test”,结果如下图。

02、spring.config.additional-location

? ? ? ?我们还可以在 Spring Boot 启动时,使用命令行参数 --spring.config.additional-location 来加载外部配置文件。

  • java -jar {JAR} --spring.config.additional-location={外部配置文件全路径}

? ? ? ?但与?--spring.config.location 不同,--spring.config.additional-location 不会使项目默认的配置文件失效,使用该命令行参数添加的外部配置文件会与项目默认的配置文件共同生效,形成互补配置,且其优先级是最高的,比所有默认配置文件的优先级都高。

示例 2

001. 将?springbootdemo 打包为 JAR 文件,打开命令行窗口,跳转到该项目 JAR 所在目录下,执行以下命令启动该项目。

  • java -jar springbootdemo-0.0.1-SNAPSHOT.jar --spring.config.additional-location=D:\myConfig\my-application.yml

结果如下图。

注意:Maven 对项目进行打包时,位于项目根目录下的配置文件是无法被打包进项目的 JAR 包的,因此位于根目录下的默认配置文件无法在 JAR 中生效,即该项目将只加载指定的外部配置文件和项目类路径(classpath)下的默认配置文件,它们的加载优先级顺序为:

  1. spring.config.additional-location 指定的外部配置文件 my-application.yml
  2. classpath:/config/application.yml
  3. classpath:/application.yml

根据配置文件优先级分析可知:

  • 以上三个配置文件中 my-application.yml 的优先级最高,因此该项目的服务器端口号为 “8088”;
  • 只有?classpath:/config/application.yml 中配置了上下文路径(context-path),因此该项目的上下文路径为 “/helloworld”;
  • 基于以上配置分析,得出该项目访问路径为“http://localhost:8088/helloWorld”。

002. 使用浏览器访问 “http://localhost:8088/helloworld/test”,结果如下图。
?

通过上面的示例,我们看到将 Spring Boot 项目打包后,然后在命令行启动命令中添加 spring.config.additional-location 参数指定外部配置文件,会导致项目根目录下的配置文件无法被加载,我们可以通过以下 3 种方式解决这个问题。

  • 在 IDEA 的运行配置(Run/Debug Configuration)中,添加虚拟机参数 -Dspring.config.additional-location=D:\myConfig\my-application.yml,指定外部配置文件;
  • 在 IDEA 的运行配置(Run/Debug Configuration)中,添加程序运行参数 --spring.config.additional-location=D:\myConfig\my-application.yml,指定外部配置文件;
  • 在主启动类中调用?System.setProperty()方法添加系统属性 spring.config.additional-location,指定外部配置文件。?

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:指定上下文路径(项目的访问路径)。

执行结果如下图。

配置文件

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

图 说明如下:

  • /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。

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 目录下,执行以下命令启动 Spring Boot。

  • 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”。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 17:59:01  更:2022-05-24 18:01:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:25:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码