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

news2025/7/3 10:18:22

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.coloradmin.cn/o/2344570.html

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

相关文章

puppeteer注入浏览器指纹过CDP

一、背景 通过puppeteer爬取目标网站时&#xff0c;经常会被对方网站检测到&#xff0c;比如原生puppeteerCDP特征非常明显&#xff0c;另外指纹如果一直不变&#xff0c;也会引发风控 二、实现 通过以下几行代码即可轻松过大部分检测点&#xff0c;并且能够切换指纹&#x…

软件项目实施全流程及交付物清单

需求分析 -> 概要设计 -> 详细设计 -> 开发实现 -> 测试 -> 部署 -> 运维 一、确认项目目标、范围和团队成员 二、收集和分析客户需求&#xff0c;确定需求规格 三、制定详细的项目计划&#xff0c;包括时间表、资源计划、预算 四、系统架构设计&#xf…

【2025计算机网络-面试常问】http和https区别是什么,http的内容有哪些,https用的是对称加密还是非对称加密,流程是怎么样的

HTTP与HTTPS全面对比及HTTPS加密流程详解 一、HTTP与HTTPS核心区别 特性HTTPHTTPS协议基础明文传输HTTP SSL/TLS加密层默认端口80443加密方式无加密混合加密&#xff08;非对称对称&#xff09;证书要求不需要需要CA颁发的数字证书安全性易被窃听、篡改、冒充防窃听、防篡改…

从梯度消失到百层网络:ResNet 是如何改变深度学习成为经典的?

自AlexNet赢得2012年ImageNet竞赛以来&#xff0c;每个新的获胜架构通常都会增加更多层数以降低错误率。一段时间内&#xff0c;增加层数确实有效&#xff0c;但随着网络深度的增加&#xff0c;深度学习中一个常见的问题——梯度消失或梯度爆炸开始出现。 梯度消失问题会导致梯…

Uni-App 多端电子合同开源项目介绍

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

多语言笔记系列:共享数据

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

如何使用SeedProd创建无缝的WordPress维护页面

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

使用Python设置excel单元格的字体(font值)

一、前言 通过使用Python的openpyxl库&#xff0c;来操作excel单元格&#xff0c;设置单元格的字体&#xff0c;也就是font值。 把学习的过程分享给大家。大佬勿喷&#xff01; 二、程序展示 1、新建excel import openpyxl from openpyxl.styles import Font wb openpyxl.…

求解,如何控制三相无刷电机?欢迎到访评论

问题&#xff1a;通过一个集成的TF2104芯片控制H桥上桥臂和下桥臂&#xff0c;如何控制&#xff1f;还是说得需要PWM_UH和PWM_UL分开控制&#xff1f;

365打卡第R3周: RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 &#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.10 编译器&#xff1a;Jupyter Lab 深度学习环境&#xff1a;torch2.5.1 torchvision0…

【实战】基于强化学习的 Agent 训练框架全流程拆解

一、引言 在人工智能蓬勃发展的今天&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;作为让智能体&#xff08;Agent&#xff09;在复杂环境中自主学习并做出最优决策的核心技术&#xff0c;正日益受到关注。从游戏领域中击败人类顶尖选手的 AlphaGo&a…

【音视频】⾳频处理基本概念及⾳频重采样

一、重采样 1.1 什么是重采样 所谓的重采样&#xff0c;就是改变⾳频的采样率、sample format、声道数等参数&#xff0c;使之按照我们期望的参数输出。 1.2 为什么要重采样 为什么要重采样? 当然是原有的⾳频参数不满⾜我们的需求&#xff0c;⽐如在FFmpeg解码⾳频的时候…

Prompt 结构化提示工程

Prompt 结构化提示工程 目前ai开发工具都大同小异&#xff0c;随着deepseek的流行&#xff0c;ai工具的能力都差不太多&#xff0c;功能基本都覆盖到了。而prompt能力反而是需要更加关注的&#xff08;说白了就是能不能把需求清晰的输出成文档&#xff09;。因此大家可能需要加…

Pycharm 代理配置

Pycharm 代理配置 文章目录 Pycharm 代理配置1. 设置系统代理1.1 作用范围1.2 使用场景1.3 设置步骤 2. 设置 python 运行/调试代理2.1 作用范围2.2 使用场景2.3 设置步骤 Pycharm 工具作为一款强大的 IDE&#xff0c;其代理配置在实际开发中也是必不可少的&#xff0c;下面介绍…

Spring Native:GraalVM原生镜像编译与性能优化

文章目录 引言一、Spring Native与GraalVM基础1.1 GraalVM原理与优势1.2 Spring Native架构设计 二、原生镜像编译实践2.1 构建配置与过程2.2 常见问题与解决方案 三、性能优化技巧3.1 内存占用优化3.2 启动时间优化3.3 实践案例分析 总结 引言 微服务架构的普及推动了轻量级、…

药监平台上传数据报资源码不存在

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

【Linux应用】交叉编译环境配置,以及最简单粗暴的环境移植(直接从目标板上复制)

【Linux应用】交叉编译环境配置&#xff0c;以及最简单粗暴的环境移植&#xff08;直接从目标板上复制&#xff09; 文章目录 交叉编译器含有三方库的交叉编译直接从目标板上复制编译环境glibc库不一致报错方法1方法2 附录&#xff1a;ZERO 3烧录ZERO 3串口shell外设挂载连接Wi…

CSS3布局方式介绍

CSS3布局方式介绍 CSS3布局&#xff08;Layout&#xff09;系统是现代网页设计中用于构建页面结构和控制元素排列的一组强大工具。CSS3提供了多种布局方式&#xff0c;每种方式都有其适用场景&#xff0c;其中最常用的是Flexbox和CSS Grid。 先看传统上几种布局方式&#xff…

FPGA设计 时空变换

1、时空变换基本概念 1.1、时空概念简介 时钟速度决定完成任务需要的时间&#xff0c;规模的大小决定完成任务所需要的空间&#xff08;资源&#xff09;&#xff0c;因此速度和规模就是FPGA中时间和空间的体现。 如果要提高FPGA的时钟&#xff0c;每个clk内组合逻辑所能做的事…

《AI大模型趣味实战》智能Agent和MCP协议的应用实例:搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用

智能Agent和MCP协议的应用实例&#xff1a;搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用 引言 随着人工智能技术的飞速发展&#xff0c;智能Agent与模型上下文协议(MCP)的应用场景越来越广泛。本报告将详细介绍如何基于Python Flask框架构建一个智能应用&…