Spring Boot 配置源详解(完整版)
Spring Boot 配置源详解(完整版)
一、配置源加载顺序与优先级
配置源类型 | 优先级顺序(从高到低) | 对应配置类/接口 | 是否可覆盖 | 典型文件/来源 |
---|---|---|---|---|
命令行参数(--key=value ) | 1(最高) | SimpleCommandLinePropertySource (org.springframework.core.env ) | 是 | 启动参数(如 java -jar app.jar --server.port=9090 ) |
SPRING_APPLICATION_JSON | 2 | MapPropertySource (org.springframework.core.env ) | 是 | 环境变量或系统属性(如 -Dspring.application.json={...} ) |
系统环境变量 | 3 | SystemEnvironmentPropertySource (org.springframework.core.env ) | 是 | 操作系统环境变量(如 export APP_NAME=myapp ) |
@PropertySource 注解 | 4 | PropertySourcesPropertyResolver (org.springframework.core.env ) | 是 | 代码中指定的资源路径(如 classpath:custom.properties ) |
ServletConfig 初始化参数 | 5 | ServletConfigPropertySource (org.springframework.boot.env ) | 是 | Web 容器配置(如 Tomcat 的 context-param ) |
ServletContext 初始化参数 | 6 | ServletContextPropertySource (org.springframework.boot.env ) | 是 | Web 容器配置(如 Tomcat 的 init-param ) |
JNDI 环境变量 | 7 | JndiPropertySource (org.springframework.core.env ) | 是 | JNDI 服务器配置(如 java:comp/env ) |
随机属性(random.* ) | 8 | RandomValuePropertySource (org.springframework.boot.env ) | 否 | 自动生成随机值(如 random.number=12345 ) |
类路径 application.properties /.yml | 9 | YamlPropertySourceLoader , PropertiesPropertySourceLoader (org.springframework.boot.env ) | 否 | src/main/resources/application.properties |
资源目录 application.properties | 10 | ResourcePropertySource (org.springframework.core.env ) | 是 | 外部目录(如 /config/application.properties ) |
Profile 特定配置(如 application-dev.properties ) | 11 | ProfileSpecificPropertySource (org.springframework.boot.env ) | 是 | src/main/resources/application-{profile}.properties |
外置配置文件(如 external-config/application.properties ) | 12 | ExternalConfigPropertySource (org.springframework.boot.env ) | 是 | 外置路径(如 /opt/config/application.properties ) |
二、配置源加载流程详解
-
初始化 Environment:
- Spring Boot 启动时,通过
SpringApplication
创建Environment
对象(类型StandardEnvironment
)。 Environment
管理所有配置源的集合PropertySources
。
- Spring Boot 启动时,通过
-
加载引导配置:
- 通过
PropertySourceBootstrapConfiguration
加载bootstrap.yml/properties
(用于配置加密、外部配置文件路径等)。
- 通过
-
逐层加载配置源:
- 使用
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);
- 使用
-
合并配置源:
- 按优先级顺序合并所有
PropertySource
,高优先级覆盖低优先级的同名属性。
- 按优先级顺序合并所有
三、配置转换过程
-
属性解析:
- 通过
ConfigurationPropertySources
将所有PropertySource
转换为ConfigurationPropertySource
:// 示例:解析属性路径 ConfigurationPropertyName name = ConfigurationPropertyName.of("server.port");
- 通过
-
绑定到 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);} }
- 使用
-
类型转换:
- 通过
ConversionService
处理类型转换(如String
转Integer
):@Bean public ConversionService conversionService() {GenericConversionService service = new GenericConversionService();service.addConverter(String.class, Integer.class, s -> Integer.parseInt(s));return service; }
- 通过
四、嵌套与替换规则
-
变量替换:
- 支持
${key}
语法引用其他属性:# application.properties base.url=http://example.com api.url=${base.url}/api
- 支持
-
优先级覆盖:
- 高优先级配置源的值覆盖低优先级的同名属性:
# application.properties: server.port=8080 # 命令行参数:--server.port=9090 → 最终值为 9090
- 高优先级配置源的值覆盖低优先级的同名属性:
-
多文档合并:
- 同名属性按加载顺序依次覆盖,最终保留最高优先级的值。
五、配置源对比表
配置源类型 | 位置/来源 | 是否可覆盖 | 典型使用场景 | 代码示例 |
---|---|---|---|---|
命令行参数 | 启动参数 | 是 | 运行时动态配置 | 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.properties | 低 | PropertiesPropertySourceLoader | 否 | 内置资源路径 | src/main/resources/application.properties |
外置配置文件 | 中低 | ExternalConfigPropertySource | 是 | 外部文件路径 | /config/application.properties |
关键代码类参考
- 加载器:
YamlPropertySourceLoader
,PropertiesPropertySourceLoader
(org.springframework.boot.env
) - 环境管理:
StandardEnvironment
,ConfigurableEnvironment
(org.springframework.core.env
) - 绑定机制:
Binder
,ConfigurationPropertyBindingPostProcessor
(org.springframework.boot.context.properties
)
通过上述流程,Spring Boot 实现了灵活且可扩展的配置管理能力,开发者可根据需求选择合适的配置源并控制优先级。
相关文章:

Spring Boot 配置源详解(完整版)
Spring Boot 配置源详解(完整版) 一、配置源加载顺序与优先级 配置源类型优先级顺序(从高到低)对应配置类/接口是否可覆盖典型文件/来源命令行参数(--keyvalue)1(最高)SimpleComman…...
JDK 17 与 Spring Cloud Gateway 新特性实践指南
一、环境要求与版本选择 1. JDK 17 的必要性 最低版本要求:Spring Boot 3.x 及更高版本(如 3.4)强制要求 JDK 17,以支持 Java 新特性(如密封类、模式匹配)和性能优化。JDK 17 核心特性: 密封类…...
异构迁移学习(无创脑机接口中的跨脑电帽迁移学习)
本文介绍BCI中的跨脑电帽的迁移学习最新算法。 (发表于2025 arxiv,应该属于投稿阶段,这个场景具有非常不错的研究意义和前景) 最新跨脑电帽异构算法github开源代码 SDDA算法原文 一、脑机接口绪论 脑机接口(BCI)指在人或动物大脑与外部设备之间创建的直接连接,通过脑…...

puppeteer注入浏览器指纹过CDP
一、背景 通过puppeteer爬取目标网站时,经常会被对方网站检测到,比如原生puppeteerCDP特征非常明显,另外指纹如果一直不变,也会引发风控 二、实现 通过以下几行代码即可轻松过大部分检测点,并且能够切换指纹&#x…...
1.8软考系统架构设计师:系统架构设计师概述 - 练习题附答案及超详细解析
系统架构设计师概述综合知识单选题 每道题均附有答案解析: 架构设计师的定义、职责和任务 1、系统架构设计师的核心职责是: A. 编写具体功能模块的代码 B. 制定系统整体架构和技术选型 C. 管理项目预算和进度 D. 直接对接客户进行销售支持 答案&#x…...

软件项目实施全流程及交付物清单
需求分析 -> 概要设计 -> 详细设计 -> 开发实现 -> 测试 -> 部署 -> 运维 一、确认项目目标、范围和团队成员 二、收集和分析客户需求,确定需求规格 三、制定详细的项目计划,包括时间表、资源计划、预算 四、系统架构设计…...

【2025计算机网络-面试常问】http和https区别是什么,http的内容有哪些,https用的是对称加密还是非对称加密,流程是怎么样的
HTTP与HTTPS全面对比及HTTPS加密流程详解 一、HTTP与HTTPS核心区别 特性HTTPHTTPS协议基础明文传输HTTP SSL/TLS加密层默认端口80443加密方式无加密混合加密(非对称对称)证书要求不需要需要CA颁发的数字证书安全性易被窃听、篡改、冒充防窃听、防篡改…...

从梯度消失到百层网络:ResNet 是如何改变深度学习成为经典的?
自AlexNet赢得2012年ImageNet竞赛以来,每个新的获胜架构通常都会增加更多层数以降低错误率。一段时间内,增加层数确实有效,但随着网络深度的增加,深度学习中一个常见的问题——梯度消失或梯度爆炸开始出现。 梯度消失问题会导致梯…...
2025.4.26总结
今天把马良老师的《职场十二法则》看完后,感触极大,这们课程就是一场职场启蒙课。 虽然看过不少关于职场的书籍,但大多数是关于职场进阶,方法方面的。并没有解答“面对未来二三十年的职场生涯,我该怎么去看待自己的工…...

Uni-App 多端电子合同开源项目介绍
项目概述 本项目是一款基于 uni-app框架开发的多端电子合同管理平台,旨在为企业及个人用户提供高效、安全、便捷的电子合同签署与管理服务。项目创新性地引入了 “证据链”与“非证据链”两种签署模式,满足不同场景下的签署需求,支持多种签署…...

多语言笔记系列:共享数据
在笔记中共享数据(变量) 使用 .NET 交互式内核,可以在单个笔记本中以多种语言编写代码。为了利用每种语言的不同优势,您会发现在它们之间共享数据很有用。即一种语言的变量,可以在其它语言中使用。 默认情况下,.NET Interactive …...

如何使用SeedProd创建无缝的WordPress维护页面
不管您刚接触 WordPress ,还是经验丰富的站长,SeedProd 都是创建网站维护页面的得力助手。通过SeedProd,您可以轻松创建一个与网站风格一致、功能齐全的维护页面,让您的用户在网站维护期间也能感受到您的专业与关怀。本文将为您提…...

使用Python设置excel单元格的字体(font值)
一、前言 通过使用Python的openpyxl库,来操作excel单元格,设置单元格的字体,也就是font值。 把学习的过程分享给大家。大佬勿喷! 二、程序展示 1、新建excel import openpyxl from openpyxl.styles import Font wb openpyxl.…...
【PCB工艺】推挽电路及交越失真
推挽电路(Push-Pull Circuit) 推挽电路(Push-Pull Circuit) 是一种常用于功率放大、电机驱动、音频放大等场合的电路结构,具有输出对称、效率高、失真小等优点。 什么是推挽电路? 推挽是指:由两种极性相反的器件(如 NPN 和 PNP、NMOS 和 PMOS)交替导通,一个“推”电…...
告别手动映射:在 Spring Boot 3 中优雅集成 MapStruct
在日常的后端开发中,我们经常需要在不同的对象之间进行数据转换,例如将数据库实体(Entity)转换为数据传输对象(DTO)发送给前端,或者将接收到的 DTO 转换为实体进行业务处理或持久化。手动进行这…...
uv run 都做了什么?
uv run 都做了什么? uv run <命令> [参数...] 的主要作用是:在一个由 uv 管理或发现的 Python 虚拟环境中,执行你指定的 <命令>。它会临时配置一个子进程的环境,使其表现得如同该虚拟环境已经被激活一样。这意味着&am…...

求解,如何控制三相无刷电机?欢迎到访评论
问题:通过一个集成的TF2104芯片控制H桥上桥臂和下桥臂,如何控制?还是说得需要PWM_UH和PWM_UL分开控制?...
Java ThreadLocal与内存泄漏
当我们利用 ThreadLocal 来管理数据时,我们不可避免地会面临内存泄漏的风险。 原因在于 ThreadLocal 的工作方式。当我们在当前线程的 ThreadLocalMap 中存储一个值时,一旦这个值不再需要,释放它就变得至关重要。如果不这样做,那么…...

365打卡第R3周: RNN-心脏病预测
🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 🏡 我的环境: 语言环境:Python3.10 编译器:Jupyter Lab 深度学习环境:torch2.5.1 torchvision0…...
1.1.1 用于排序规则的IComparable接口使用介绍
在C#中,IComparable 是一个核心接口,用于定义对象的自然排序规则。实现该接口的类可以指定其实例如何与其他实例比较大小,从而支持排序操作(如 Array.Sort()、List.Sort()). 1. 该接口CompareTo返回值含义:…...

【实战】基于强化学习的 Agent 训练框架全流程拆解
一、引言 在人工智能蓬勃发展的今天,强化学习(Reinforcement Learning, RL)作为让智能体(Agent)在复杂环境中自主学习并做出最优决策的核心技术,正日益受到关注。从游戏领域中击败人类顶尖选手的 AlphaGo&a…...

【音视频】⾳频处理基本概念及⾳频重采样
一、重采样 1.1 什么是重采样 所谓的重采样,就是改变⾳频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。 1.2 为什么要重采样 为什么要重采样? 当然是原有的⾳频参数不满⾜我们的需求,⽐如在FFmpeg解码⾳频的时候…...

Prompt 结构化提示工程
Prompt 结构化提示工程 目前ai开发工具都大同小异,随着deepseek的流行,ai工具的能力都差不太多,功能基本都覆盖到了。而prompt能力反而是需要更加关注的(说白了就是能不能把需求清晰的输出成文档)。因此大家可能需要加…...
设计心得——数据结构的意义
一、数据结构 在老一些的程序员中,可能都听说过,程序其实就是数据结构算法这种说法。它是由尼克劳斯维特在其著作《算法数据结构程序》中提出的,然后在一段时期内这种说法非常流行。这里不谈论其是否正确,只是通过这种提法&#…...
【Pandas】pandas DataFrame rdiv
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

Pycharm 代理配置
Pycharm 代理配置 文章目录 Pycharm 代理配置1. 设置系统代理1.1 作用范围1.2 使用场景1.3 设置步骤 2. 设置 python 运行/调试代理2.1 作用范围2.2 使用场景2.3 设置步骤 Pycharm 工具作为一款强大的 IDE,其代理配置在实际开发中也是必不可少的,下面介绍…...
GPU 加速库(CUDA/cuDNN)
现代数字图像处理与深度学习任务对计算效率提出极高要求,GPU 加速库通过硬件并行计算能力大幅提升数据处理速度。 一、CUDA 并行计算架构深度解析 1. 架构设计与硬件协同 CPU-GPU 异构计算模型CPU 作为主机端,主要负责逻辑控制、任务调度以及数据预处…...

Spring Native:GraalVM原生镜像编译与性能优化
文章目录 引言一、Spring Native与GraalVM基础1.1 GraalVM原理与优势1.2 Spring Native架构设计 二、原生镜像编译实践2.1 构建配置与过程2.2 常见问题与解决方案 三、性能优化技巧3.1 内存占用优化3.2 启动时间优化3.3 实践案例分析 总结 引言 微服务架构的普及推动了轻量级、…...
JAVA JVM面试题
你的项目中遇到什么问题需要jvm调优,怎么调优的,堆的最小值和最大值设置为什么不设置成一样大? 在项目中,JVM调优通常源于以下典型问题及对应的调优思路,同时关于堆内存参数(-Xms/-Xmx)的设置逻…...

药监平台上传数据报资源码不存在
问题:电子监管码上传药监平台提示“导入的资源码不存在” 现象:从生产系统导出的关联关系数据包上传到药监平台时显示: 原因:上传数据包的通道的资源码与数据包的资源码不匹配。 解决方法:检查药监平台和生产系统的药…...