当前位置:AIGC资讯 > AIGC > 正文

SpringBoot配置文件高级用法实战

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

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

文章目录

一、总体优先级顺序 二、应用配置文件的详细优先级 三、文件类型优先级 四、特定环境配置 五、配置文件高级用法 5.1 修改配置文件名 5.2 修改配置文件位置 5.3 使用文件系统路径 5.4 附加配置文件 5.5 可选位置 5.6 通配符位置 5.7 特定配置文件 5.8 导入其它配置 5.9 导入无扩展文件 六、多配置文件处理方式 背景需求 解决方法一 解决方法二

一、总体优先级顺序

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

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

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

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

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

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

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

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

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

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

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

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

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

类路径下的config包:src/main/resources/config目录中的配置文件。

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

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

三、文件类型优先级

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

.properties .yml .yaml

四、特定环境配置

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

五、配置文件高级用法

假设有以下配置文件:

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

pack:
  name: root-name
  age: 11

类路径config包下application.yml内容:

pack:
  name: classpath/config-name

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

name = classpath/config-name, age = 11

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

5.1 修改配置文件名

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

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

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

java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml,optional:classpath:/config/pack1.yml

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

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

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

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加载额外的配置文件:

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:前缀忽略配置文件不存在的错误:

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 属性从其他位置导入更多配置数据。导入会在被发现时被处理,并被视为紧接在声明导入的文档下面插入的附加文档:

pack:
  name: root name    
  age: 66
---  
spring:
  config:
    import:
    - file:f:/pack-akf.yml

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

5.9 导入无扩展文件

…代码省略…

六、多配置文件处理方式

背景需求

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

cfg1.properties
cfg2.properties
解决方法一

合并所有配置文件至一个文件中配置加载,然后使用spring.config.location配置加载。
把cfg1.properties和cfg2.properties中的配置都合并至cfg.properties中。

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

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

java -jar api.jar --spring.config.location=file:/path/cfg1.properties,file:/path/cfg2.properties
关注公众号[码到三十五]获取更多技术干货 !

总结


❃博主首页 :
「码到三十五」
,同名公众号 :「码到三十五」,wx号 : 「liwu0213」

☠博主专栏 :
<mysql高手>
<elasticsearch高手>
<源码解读>
<java核心>
<面试攻关>

♝博主的话 :
搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基


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




文章目录



一、总体优先级顺序
二、应用配置文件的详细优先级
三、文件类型优先级
四、特定环境配置
五、配置文件高级用法
5.1 修改配置文件名
5.2 修改配置文件位置
5.3 使用文件系统路径
5.4 附加配置文件
5.5 可选位置
5.6 通配符位置
5.7 特定配置文件
5.8 导入其它配置
5.9 导入无扩展文件
六、多配置文件处理方式
背景需求
解决方法一
解决方法二




一、总体优先级顺序


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


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


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


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


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


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


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


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



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


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


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


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


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


类路径下的config包:src/main/resources/config目录中的配置文件。


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


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



三、文件类型优先级


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


.properties
.yml
.yaml


四、特定环境配置


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



五、配置文件高级用法


假设有以下配置文件:



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

pack:
name: root-name
age: 11

类路径config包下application.yml内容:

pack:
name: classpath/config-name

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


name = classpath/config-name, age = 11

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



5.1 修改配置文件名

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


java -jar springboot-configfile-1.0.0.jar --spring.config.name=pack


5.2 修改配置文件位置

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


java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/pack.yml,optional:classpath:/config/pack1.yml

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


java -jar springboot-configfile-1.0.0.jar --spring.config.location=optional:classpath:/config/ --spring.config.name=pack


5.3 使用文件系统路径

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


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加载额外的配置文件:


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:前缀忽略配置文件不存在的错误:


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 属性从其他位置导入更多配置数据。导入会在被发现时被处理,并被视为紧接在声明导入的文档下面插入的附加文档:


pack:
name: root name
age: 66
---
spring:
config:
import:
- file:f:/pack-akf.yml

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



5.9 导入无扩展文件

…代码省略…



六、多配置文件处理方式



背景需求

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


cfg1.properties
cfg2.properties


解决方法一

合并所有配置文件至一个文件中配置加载,然后使用spring.config.location配置加载。
把cfg1.properties和cfg2.properties中的配置都合并至cfg.properties中。


java -jar app.jar --spring.config.location=file:/path/to/cfg.properties


解决方法二

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


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


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

更新时间 2024-08-16