【springboot开发】Spring Boot 配置文件高级用法

news/2024/12/26 13:17:23/文章来源:https://www.cnblogs.com/o-O-oO/p/18555872
一、总体优先级顺序二、应用配置文件的详细优先级三、文件类型优先级四、特定环境配置五、配置文件高级用法六、案例: 多配置文件处理方式

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

一、总体优先级顺序

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

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

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

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

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

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

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

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

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

对于application.properties或application.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.yml、application-prod.yml)时,激活的特定环境配置文件将覆盖通用配置文件中的相同属性。如果指定了多个特定环境配置文件,则后面的配置文件将覆盖前面的配置文件中的相同属性。

五、配置文件高级用法

假设有以下配置文件:

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

pack:name: root-nameage: 11

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

pack:name: classpath/config-name

读取配置pack.name和pack.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 通配符位置

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

java -jar springboot-configfile-1.0.0.jar 
--spring.config.additional-location=file:f:/sb-config/*/

5.7 特定配置文件

Spring Boot 支持加载特定环境的配置文件(如application-prod.yml):

java -jar springboot-configfile-1.0.0.jar 
--spring.profiles.active=prod,live

5.8 导入其它配置

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

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

在处理默认的该配置文件(application.yml)时,当处理完pack.age时紧接着是spring.config.import配置,那么就会将导入的pack-akf.yml配置文件内容插入到当前已经解析到的位置。

注意1:pack-akf.yml中的配置内容如果包含pack.name那么会覆盖这里的pack.name内容。

注意2: 这里的import也会导入相应的特定配置文件。如果激活了下面配置

spring:profiles:active:- prod

那么如果当前f:/下存在pack-akf-prod.yml文件,那么也会被导入。

5.9 导入无扩展文件

要导入无扩展名的文件,需要给 Spring Boot 一个提示,以便它知道如何加载这些文件。为此,可以将扩展名提示放在方括号中:


spring:config:import:- file:f:/ack[.yml]

六、案例:多配置文件处理方式

背景需求

程序在部署的时候,一般是将配置文件放在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

原创 码到三十五

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/837084.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】微服务中token鉴权设计的4种方式总结

一、JWT鉴权1.1 概述1.2 实现步骤1.2.1 用户登录1.2.2 存储JWT 1.2.3 请求携带JWT1.2.4 服务端验证JWT 1.3 优点 二、OAuth 2.0鉴权2.1 概述2.2 实现步骤2.2.1 授权服务器2.2.2 资源服务器 2.2.3 客户端 2.3 优点三、统一授权中心(API Gateway)3.1 概述3.2 实现步骤 3.2.1 部…

【架构】一文搞懂多规格商品、组合商品模型设计

今天聊聊多规格商品、组合商品模型设计。 一、多规格商品 1.1 什么是多规格商品 多规格商品是指同一款商品具有多个不同的规格或属性,例如颜色、尺寸、材质、容量等。这些规格使得商品能够满足不同消费者的偏好和需求。在新零售系统中,多规格商品通常会以一个商品条目展示,消…

【架构】多租户系统的核心概念模型

让我们深入探讨一下多租户系统的概念模型。概念模型是多租户系统的"骨架",帮助我们理解系统各部分的组织和运作方式。 多租户的核心概念模型 • 租户:通常指一个企业客户,不同租户之间的数据和行为是相互隔离的。• 用户:某个租户内的具体使用者,使用账号、密码…

WinForm 设计器中DPI感知错误解决方法

这张图是WinForm在1080P分辨率下开发的一个Form,但是代码到高分辨率屏幕就会变成这个鸟样虽然说可以通过DPI感知让程序在运行的时候显示出正确的样式,但是这样让我们在设计的时候很是苦恼 在翻看了WinForm微软官方在Net8的更新,发现了这样的一条:我们在项目csproj里面加入一…

安装kali purple后要做的事

1、切换中文sudo dpkg-reconfigure locales翻到最后,找到zh_cn重启搞定。 2、换源vim /etc/apt/sources.list打开后注释原来的源,换上国内源。 先用 # 把原本的注释掉: 之后,在下面添加上新的源: aliyun 阿里云 deb http://mirrors.aliyun.com/kali kali-rolling main no…

博客同步到腾讯云开发者社区声明

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=26x714yb3cb3作者:翎野君 出处:http://www.cnblogs.com/lingyejun/ 若本文如对您有帮助,不妨点击一下右下角的【推荐】。如果您喜欢或希望看到更多我…

考研打卡(22)

开局(22) 开始时间 2024-11-19 23:02:31 结束时间 2024-11-19 23:58:31今天开会,我真是碎掉了数据结构假设某段通信电文仅由 6 个字母 ABCDEF 组成, 字母在电文中出现的频率分别为 2,3,7,15,4,6。 根据这些频率作为权值构造哈夫曼编码, 终构造出的哈夫曼树带权路径长…

使用分区助手扩充C盘空间

检查设备加密状态 首先,进入设备的设置界面,查看设备加密选项是否已开启。如果加密已开启,需要先关闭加密功能。此过程大约需要十几分钟时间,具体时间取决于设备的配置和数据量。使用分区助手扩展磁盘空间选择空闲空间较多的磁盘 在分区助手中,选中一个空闲空间较多的磁盘…

DQL多表查询

select *from 表名,表名 会输出这两个表的笛卡尔积select *from 表名 限制条件表名不能在同一条指令中反复使用,所以应当起别名,如表名 别名, 表名 别名;可以自身连接查询 在select语句后面加两个相同的表 外连接查询 用inner join,需要加on select * from 表名 inner jo…

《数据结构》课程作业

第二章 PTA编程题 一共十道编程题 难度排序: \[\begin{align} 6<8<5<7<5<10<1=2<3\le 4<9 \nonumber \end{align} \]6-1 有序链表合并(无重复) 双指针法 def merge_list(la, lb):ans = LinkList()p = ans.headp1 = la.head.nextp2 = lb.head.nextwh…

《Django 5 By Example》阅读笔记:p651-p678

《Django 5 By Example》学习第9天,p651-p678总结,总计28页。 一、技术总结 1.aggregate() (1)aggregate:ad-("to") + gregare("to collection into a flock(群), to gather") 因为ad 后面跟的是gregate,为了发音方便,ad演变为了ag。aggregate的本意…

k8s阶段02 namespace,pod资源及命令, pod资源配置(应用监控,资源需求和限制), 多容器pod(初始容器), k8s卷基础

namespaceNamespace: 名称空间,命名空间资源对象名称隔离www.google.com, www.magedu.com资源类型:名称空间级别:必须属于某个名称空间-n NAMESPACE_NAME --namespace NAMESPACE_NAME集群级别:不属于任何名称名称 命令: kubectl get kubectl get TYPE [name, ...]…