SpringBoot配置文件高级用法实战

❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基


Spring Boot配置文件的优先级是一个重要的概念,它决定了当存在多个配置文件时,哪个配置文件中的配置将被优先采用。

文章目录

一、总体优先级顺序

  1. 命令行参数 :通过命令行启动参数指定的配置拥有最高优先级。这包括java -jar命令后跟随的配置参数。

  2. 来自SPRING_APPLICATION_JSON的属性:嵌入在环境变量或系统属性中的JSON格式配置信息,优先级仅次于命令行参数。

  3. 系统属性 :通过Java系统属性传递的配置值,例如使用-D参数设置的值。

  4. 环境变量:操作系统环境变量中的配置值。

  5. 随机生成的属性(仅用于开发中的随机端口号等):Spring Boot在开发环境中可以随机生成一些属性,例如随机端口号。

  6. 应用配置文件(application.propertiesapplication.yml:按照特定顺序加载的配置文件。

  7. @Configuration类中通过@PropertySource注解定义的属性:通过编程方式指定的配置文件。

  8. 默认属性 (通过SpringApplication.setDefaultProperties指定的默认属性):这些属性在所有其他特定属性源之后加载,因此优先级最低。

二、应用配置文件的详细优先级

对于application.propertiesapplication.yml等应用配置文件,Spring Boot按照以下顺序加载,优先级从高到低:

  1. 命令行中指定的配置文件 :通过--spring.config.location参数指定的配置文件。

  2. 项目目录下的config子目录 :位于项目根目录下的config(和jar包同一目录)文件夹中的配置文件。

  3. 项目根目录:项目根目录(和jar包同一目录)下的配置文件。

  4. 类路径下的configsrc/main/resources/config目录中的配置文件。

  5. 类路径根目录src/main/resources目录中的配置文件。

特别注意的是,配置文件内容是在的合并的前提下执行优先级,即不重复的配置内容会合并!

三、文件类型优先级

在同一位置下,如果存在多种类型的配置文件(如.properties.yml.yaml),它们的优先级顺序为:

  1. .properties
  2. .yml
  3. .yaml

四、特定环境配置

当使用特定环境的配置文件(如application-dev.ymlapplication-prod.yml)时,激活的特定环境配置文件将覆盖通用配置文件中的相同属性。如果指定了多个特定环境配置文件,则后面的配置文件将覆盖前面的配置文件中的相同属性。

五、配置文件高级用法

假设有以下配置文件:

  • 类路径根目录下application.yml内容:

    yaml 复制代码
    pack:
      name: root-name
      age: 11
  • 类路径config包下application.yml内容:

    yaml 复制代码
    pack:
      name: classpath/config-name

读取配置pack.namepack.age,输出结果为:

name = classpath/config-name, age = 11

这验证了配置文件内容的合并以及优先级规则。

5.1 修改配置文件名

使用spring.config.name环境属性可以修改默认的配置文件名:

bash 复制代码
java -jar springboot-configfile-1.0.0.jar --spring.config.name=pack
5.2 修改配置文件位置

使用spring.config.location环境属性指定配置文件的位置:

bash 复制代码
java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml,optional:classpath:/config/pack1.yml

使用optional:前缀可以忽略文件不存在的错误。也可以指定目录让Spring Boot自动拼接文件名:

bash 复制代码
java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/config/ --spring.config.name=pack
5.3 使用文件系统路径

指定文件系统中的配置文件路径:

bash 复制代码
java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml,optional:file:f:/
--spring.config.name=pack
5.4 附加配置文件

如需要添加其它的配置文件,并非是替换默认的配置文件,可从附加位置加载属性(可以覆盖默认位置中的属性值)。

使用spring.config.additional-location加载额外的配置文件:

bash 复制代码
java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml --spring.config.name=pack --spring.config.additional-location=optional:file:f:/pack-akf.yml
5.5 可选位置

默认当指定的配置数据文件不存在时,SpringBoot会抛出ConfigDataLocationNotFoundException异常,应用程序将无法启动.

使用optional:前缀忽略配置文件不存在的错误:

bash 复制代码
java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml --spring.config.on-not-found=ignore

忽略所有ConfigDataLocationNotFoundException并始终继续启动应用程序,可以使用spring.config.on-not-found属性

5.6 通配符位置

如配置文件位置的最后一个路径段包含*字符,则视为通配符位置。通配符会在加载配置时展开,因此直接子目录也会被检查,使用通配符加载多个配置文件:

...代码省略,请看下面的获取方式

5.7 特定配置文件

...代码省略,请看下面的获取方式

5.8 导入其它配置

在配置文件中使用 spring.config.import 属性从其他位置导入更多配置数据。导入会在被发现时被处理,并被视为紧接在声明导入的文档下面插入的附加文档:

java 复制代码
pack:
  name: root name    
  age: 66
---  
spring:
  config:
    import:
    - file:f:/pack-akf.yml

*** ...代码省略...完整代码请关注博主公众号 [ 码到三十五 ] 回复 [ springboot ] 自动获取...***

5.9 导入无扩展文件

...代码省略...

六、多配置文件处理方式

背景需求

程序在部署的时候,一般是将配置文件放在jar包的外面,而当存在多个文件需要加载时,如项目中有:

java 复制代码
cfg1.properties
cfg2.properties
解决方法一

合并所有配置文件至一个文件中配置加载,然后使用spring.config.location配置加载。

把cfg1.properties和cfg2.properties中的配置都合并至cfg.properties中。

java 复制代码
java -jar app.jar --spring.config.location=file:/path/to/cfg.properties
解决方法二

保持文件的各自独立,使用spring.config.location属性来指定应用程序的配置文件路径。可以指定多个配置文件,使用逗号分隔的文件路径,例如:

java 复制代码
java -jar api.jar --spring.config.location=file:/path/cfg1.properties,file:/path/cfg2.properties

关注公众号[码到三十五]获取更多技术干货 !

相关推荐
微软技术栈10 分钟前
极客说|利用 Azure AI Agent Service 创建自定义 VS Code Chat participant
人工智能
@心都10 分钟前
机器学习数学基础:19.线性相关与线性无关
线性代数·机器学习·概率论
QQ29607873612 分钟前
科技资讯杂志科技资讯杂志社科技资讯编辑部2024年第24期目录
人工智能
Dipeak数巅科技16 分钟前
数巅科技中标科学城数科集团AI辅助企业数字化转型评估诊断
人工智能·数据分析·商业智能bi·数字化转型
Ayakanoinu22 分钟前
【论文阅读】Adversarial Detection: Attacking Object Detection in Real Time
论文阅读·人工智能·目标检测
hai41174196224 分钟前
机器人调度系统交通管制算法
人工智能·机器人·机器人调度
带我去滑雪30 分钟前
多方法实现影像组学特征降维与选择
人工智能
怎么这么多名字都被占了1 小时前
llama.cpp的C语言API使用
c语言·人工智能·llama
sjsjsbbsbsn1 小时前
Java Web 开发中的分页与参数校验
java·spring boot·spring·状态模式·hibernate
2013crazy1 小时前
springboot基于微信小程序的仓储管理系统
spring boot·后端·微信小程序·仓储管理