Spring Boot 配置源详解(完整版)


Spring Boot 配置源详解(完整版)

在这里插入图片描述


一、配置源加载顺序与优先级
配置源类型优先级顺序(从高到低)对应配置类/接口是否可覆盖典型文件/来源
命令行参数--key=value1(最高)SimpleCommandLinePropertySourceorg.springframework.core.env启动参数(如 java -jar app.jar --server.port=9090
SPRING_APPLICATION_JSON2MapPropertySourceorg.springframework.core.env环境变量或系统属性(如 -Dspring.application.json={...}
系统环境变量3SystemEnvironmentPropertySourceorg.springframework.core.env操作系统环境变量(如 export APP_NAME=myapp
@PropertySource 注解4PropertySourcesPropertyResolverorg.springframework.core.env代码中指定的资源路径(如 classpath:custom.properties
ServletConfig 初始化参数5ServletConfigPropertySourceorg.springframework.boot.envWeb 容器配置(如 Tomcat 的 context-param
ServletContext 初始化参数6ServletContextPropertySourceorg.springframework.boot.envWeb 容器配置(如 Tomcat 的 init-param
JNDI 环境变量7JndiPropertySourceorg.springframework.core.envJNDI 服务器配置(如 java:comp/env
随机属性random.*8RandomValuePropertySourceorg.springframework.boot.env自动生成随机值(如 random.number=12345
类路径 application.properties/.yml9YamlPropertySourceLoader, PropertiesPropertySourceLoaderorg.springframework.boot.envsrc/main/resources/application.properties
资源目录 application.properties10ResourcePropertySourceorg.springframework.core.env外部目录(如 /config/application.properties
Profile 特定配置(如 application-dev.properties11ProfileSpecificPropertySourceorg.springframework.boot.envsrc/main/resources/application-{profile}.properties
外置配置文件(如 external-config/application.properties12ExternalConfigPropertySourceorg.springframework.boot.env外置路径(如 /opt/config/application.properties

二、配置源加载流程详解
  1. 初始化 Environment

    • Spring Boot 启动时,通过 SpringApplication 创建 Environment 对象(类型 StandardEnvironment)。
    • Environment 管理所有配置源的集合 PropertySources
  2. 加载引导配置

    • 通过 PropertySourceBootstrapConfiguration 加载 bootstrap.yml/properties(用于配置加密、外部配置文件路径等)。
  3. 逐层加载配置源

    • 使用 PropertySourceLoader 加载不同格式的配置文件(如 YAML、Properties):
      // 例如加载 YAML 文件
      YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
      Resource resource = new ClassPathResource("application.yml");
      PropertySource<?> yamlSource = loader.load("application", resource, 0);
      environment.getPropertySources().addLast(yamlSource);
      
  4. 合并配置源

    • 按优先级顺序合并所有 PropertySource,高优先级覆盖低优先级的同名属性。

三、配置转换过程
  1. 属性解析

    • 通过 ConfigurationPropertySources 将所有 PropertySource 转换为 ConfigurationPropertySource
      // 示例:解析属性路径
      ConfigurationPropertyName name = ConfigurationPropertyName.of("server.port");
      
  2. 绑定到 Bean

    • 使用 Binder 将属性值绑定到 @ConfigurationProperties 注解的 Bean:
      @ConfigurationProperties(prefix = "app")
      public class AppProperties {private String name;private int timeout;// getters/setters
      }@SpringBootApplication
      @EnableConfigurationProperties(AppProperties.class) // 必须启用
      public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
      }
      
  3. 类型转换

    • 通过 ConversionService 处理类型转换(如 StringInteger):
      @Bean
      public ConversionService conversionService() {GenericConversionService service = new GenericConversionService();service.addConverter(String.class, Integer.class, s -> Integer.parseInt(s));return service;
      }
      

四、嵌套与替换规则
  1. 变量替换

    • 支持 ${key} 语法引用其他属性:
      # application.properties
      base.url=http://example.com
      api.url=${base.url}/api
      
  2. 优先级覆盖

    • 高优先级配置源的值覆盖低优先级的同名属性:
      # application.properties: server.port=8080
      # 命令行参数:--server.port=9090 → 最终值为 9090
      
  3. 多文档合并

    • 同名属性按加载顺序依次覆盖,最终保留最高优先级的值。

五、配置源对比表
配置源类型位置/来源是否可覆盖典型使用场景代码示例
命令行参数启动参数运行时动态配置java -jar app.jar --server.port=9090
SPRING_APPLICATION_JSON环境变量或系统属性简单 JSON 配置-Dspring.application.json='{ "server": { "port": 9090 } }'
系统环境变量操作系统环境变量生产环境全局配置export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/db
@PropertySource 注解代码指定的资源路径内嵌特定配置文件```java
\n@Configuration\n@PropertySource(“classpath:custom.properties”)\n```
外置配置文件文件系统(如 /config生产环境外部配置/config/application.properties
Profile 特定配置类路径或外置路径不同环境差异化配置application-dev.properties

六、代码示例
1. 系统环境变量覆盖
# 操作系统环境变量设置:
export APP_NAME="ProductionApp"
// 使用 @Value 注入
@Value("${APP_NAME}")
private String appName;
2. 随机属性使用
# application.properties
random.seed=12345
@Value("${random.number}")
private int randomNum; // 自动生成随机数
3. JNDI 配置示例
// JNDI 配置(需容器支持)
@Resource(name = "java:comp/env/jdbc/datasource")
private DataSource dataSource;
4. 外置配置文件激活
# 启动命令指定配置路径:
java -jar app.jar --spring.config.location=file:/opt/config/application.properties
5. Profile 特定配置
# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/dev
// 启动时指定 Profile:
java -jar app.jar --spring.profiles.active=dev

七、总结表格
配置源类型优先级对应类/接口是否可覆盖典型文件/来源示例
命令行参数SimpleCommandLinePropertySource启动参数--server.port=9090
系统环境变量SystemEnvironmentPropertySource操作系统环境变量export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/db
类路径 application.propertiesPropertiesPropertySourceLoader内置资源路径src/main/resources/application.properties
外置配置文件中低ExternalConfigPropertySource外部文件路径/config/application.properties

关键代码类参考

  • 加载器YamlPropertySourceLoader, PropertiesPropertySourceLoaderorg.springframework.boot.env
  • 环境管理StandardEnvironment, ConfigurableEnvironmentorg.springframework.core.env
  • 绑定机制Binder, ConfigurationPropertyBindingPostProcessororg.springframework.boot.context.properties

通过上述流程,Spring Boot 实现了灵活且可扩展的配置管理能力,开发者可根据需求选择合适的配置源并控制优先级。

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

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

相关文章

【无人机】无人机遥控器设置与校准,飞行模式的选择,无线电控制 (RC) 设置

目录 1、遥控器校准 1.1、校准步骤 2、飞行模式选择&#xff0c;遥控器通道映射 2.1、配置步骤 1、遥控器校准 在校准无线电系统之前&#xff0c;必须连接/绑定接收器和发射器。绑定发射器和接收器对的过程是特定于硬件的&#xff08;有关说明&#xff0c;请参阅 RC 手册&…

Redis 有序集合 ZSet 深度解析教程

Redis-ZSet 引言一、 ZSet 核心概念与特性1.1 什么是 ZSet&#xff1f;1.2 ZSet 与 Set、List 的本质区别 二、 ZSet 典型应用场景2.1 排行榜 (Leaderboards)2.2 带权重的任务队列 / 延迟队列2.3 时间轴 (Timeline)2.4 范围查找 三、 ZSet 底层实现3.1 ziplist (压缩列表)3.2 s…

【SpringBoot】HttpServletRequest获取使用及失效问题(包含@Async异步执行方案)

目录 1. 在 Controller 方法中作为参数注入 2.使用 RequestContextHolder &#xff08;1&#xff09;失效问题 &#xff08;2&#xff09;解决方案一&#xff1a; &#xff08;3&#xff09;解决方案二&#xff1a; 3、使用AutoWrite自动注入HttpServletRequest 跨线程调…

mfc学习(一)

mfc为微软创建的一个类qt框架的客户端程序&#xff0c;只不过因为微软目前有自己 的亲身儿子C#&#xff08;.net&#xff09;,所以到2010没有进行维护。然后一些的工业企业还在继续进行维护相关的内容。我目前就接手一个现在这样的项目&#xff0c;其实本质与qt的思路是差不多的…

HarmonyOS:一多能力介绍:一次开发,多端部署

概述 如果一个应用需要在多个设备上提供同样的内容&#xff0c;则需要适配不同的屏幕尺寸和硬件&#xff0c;开发成本较高。HarmonyOS 系统面向多终端提供了“一次开发&#xff0c;多端部署”&#xff08;后文中简称为“一多”&#xff09;的能力&#xff0c;可以基于一种设计…

秒出PPT推出更强版本,AI PPT工具进入新纪元!

在现代职场中&#xff0c;PPT是我们沟通和展示信息的重要工具。无论是做产品演示&#xff0c;还是准备工作汇报&#xff0c;一份精美的PPT能大大提升演示效果。然而&#xff0c;传统的PPT制作往往需要消耗大量时间&#xff0c;尤其是在排版、设计和内容调整上。如今&#xff0c…

Godot开发2D冒险游戏——第二节:主角光环整起来!

变量的作用域 全局变量&#xff0c;局部变量&#xff0c;导出变量&#xff08;可以在检查器当中快速查看&#xff09; 为玩家添加移动动画 现在游戏的玩家还只是在滑行&#xff0c;我们需要再添加玩家每个方向上的移动效果 删除原先的Item节点&#xff0c;创建一个动画精灵…

颠覆传统NAS体验:耘想WinNAS让远程存储如同本地般便捷

在当今数据爆炸的时代&#xff0c;网络附加存储(NAS)已成为许多企业和个人用户的必备设备。然而&#xff0c;传统硬件NAS解决方案存在诸多限制&#xff0c;如高额成本、复杂设置和有限的远程访问能力。耘想WinNAS以其创新的软件解决方案&#xff0c;彻底改变了这一局面&#xf…

新市场环境下新能源汽车电流传感技术发展前瞻

新能源革命重构产业格局 在全球碳中和战略驱动下&#xff0c;新能源汽车产业正经历结构性变革。国际清洁交通委员会&#xff08;ICCT&#xff09;最新报告显示&#xff0c;2023年全球新能源汽车渗透率突破18%&#xff0c;中国市场以42%的市占率持续领跑。这种产业变革正沿着&q…

STM32之DHT11温湿度传感器---附代码

DHT11简介 DHT11的供电电压为 3&#xff0d;5.5V。 传感器上电后&#xff0c;要等待 1s 以越过不稳定状态在此期间无需发送任何指令。 电源引脚&#xff08;VDD&#xff0c;GND&#xff09;之间可增加一个100nF 的电容&#xff0c;用以去耦滤波。 DATA 用于微处理器与DHT11之间…

#define STEUER_A_H {PWM_A_ON}

目录 一、括号的区别 二、实例讲解 三、注意事项 四、总结 五、补充 一、括号的区别 大括号 {}: 在 C/C 中&#xff0c;大括号一般用于表示一个代码块或结构体、集合等。例如&#xff1a; 用于定义函数体、控制结构&#xff08;如 if、for&#xff09;的代码块。用于初始化…

Redis 缓存—处理高并发问题

Redis的布隆过滤器、单线程架构、双写一致性、比较穿透、击穿及雪崩、缓存更新方案及分布式锁。 1 布隆过滤器 是一种高效的概率型数据结构&#xff0c;用于判断元素是否存在。主要用于防止缓存穿透&#xff0c;通过拦截不存在的数据查询&#xff0c;避免击穿数据库。 原理&…

【玩转全栈】—— 无敌前端究极动态组件库--Inspira UI

目录 Inspira UI 介绍 配置环境 使用示例 效果&#xff1a; Inspira UI 学习视频&#xff1a; 华丽优雅 | Inspira UI快速上手_哔哩哔哩_bilibili 官网&#xff1a;https://inspira-ui.com/ Inspira UI 介绍 Inspira UI 是一个设计精美、功能丰富的用户界面库&#xff0c;专为…

【OpenCV图像处理实战】从基础操作到工业级应用

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现&#xff08;6个案例&#xff09;案例1&#xff1a;图像基本操作案例2&#xff1a;边缘检测案例3&…

fastjson使用parseObject转换成JSONObject出现将字符特殊字符解析解决

现象&#xff1a;将字符串的${TARGET_VALUE}转换成NULL字符串了问题代码&#xff1a; import com.alibaba.fastjson.JSON;JSONObject config JSON.parseObject(o.toString()); 解决方法&#xff1a; 1.更换fastjson版本 import com.alibaba.fastjson2.JSON;或者使用其他JS…

Docker Compose 和 Kubernetes(k8s)区别

前言&#xff1a;Docker Compose 和 Kubernetes&#xff08;k8s&#xff09;是容器化技术中两个常用的工具&#xff0c;但它们的定位、功能和适用场景有显著区别。以下是两者的核心对比&#xff1a; ​​1. 定位与目标​​ ​​特性​​ ​​Docker Compose​​ ​​Kubernet…

【21天学习打卡挑战赛】如何学习WEB安全:逼自己在短时间掌握WEB安全核心内容

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Oracle数据库巡检脚本

1.查询实例信息 SELECT INST_ID, INSTANCE_NAME, TO_CHAR(STARTUP_TIME, YYYY-MM-DD HH24:MI:SS) AS STARTUP_TIME FROM GV$INSTANCE ORDER BY INST_ID; 2.查看是否归档 archive log list 3.查看数据库参数 SELECT NAME , TYPE , VALUE FROM V$PARAMETER ORDER BY NAME; 4.…

Windows 安装 JDK

下载 Java8 的下载直接访问&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 接受协议后点击下载&#xff0c;再输入账号信息就可以下载了。 如果…

强化学习核心原理及数学框架

1. 定义与核心思想 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种通过智能体&#xff08;Agent&#xff09;与环境&#xff08;Environment&#xff09;的持续交互来学习最优决策策略的机器学习范式。其核心特征为&#xff1a; ​​试错学习​​&#x…