news 2026/4/18 5:22:32

SpringBoot 项目中 yml 配置文件的所有属性引用 / 加载方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot 项目中 yml 配置文件的所有属性引用 / 加载方式

核心前提

SpringBoot 配置加载有明确的优先级(高优先级覆盖低优先级),整体优先级从高到低大致为:自定义配置源 > 命令行参数 > 系统属性(-D) > 环境变量 > 配置中心(Nacos/Apollo) > K8s Secret/ConfigMap > 外部配置文件 > 项目内配置文件(prod > dev > default) > 内置默认配置


一、基础配置来源(项目内 / 本地文件)

这是最基础的配置方式,优先级较低,但是本地开发的核心。

1. 项目内内置配置文件

说明

SpringBoot 会默认加载src/main/resources下的application.yml/application.properties,以及分环境的application-{profile}.yml(如application-prod.yml)。

示例

yaml

# application.yml(主配置) spring: profiles: active: prod # 激活prod环境 datasource: url: jdbc:mysql://localhost:3306/test username: root password: 123456 # application-prod.yml(prod环境配置,会覆盖主配置中相同属性) spring: datasource: password: prod123456 # 覆盖主配置的密码 server: port: 8081

2. 外部配置文件(本地 / 服务器挂载)

说明

通过指定外部配置文件路径,让 SpringBoot 加载项目外的配置(优先级高于内置配置),适合生产环境灵活修改配置。

示例
  • 方式 1:启动时指定配置文件路径

    bash

    运行

    # 方式A:指定配置文件绝对路径 java -jar app.jar --spring.config.location=/opt/config/application-prod.yml # 方式B:指定配置目录(SpringBoot会加载该目录下的application.yml) java -jar app.jar --spring.config.additional-location=/opt/config/
  • 方式 2:yml 中引用外部文件(比如证书、自定义配置)

    yaml

    # 引用外部文件中的内容 app: ssl: cert-path: /opt/cert/server.crt # 直接引用外部文件路径 key-content: ${file:/opt/config/secret.key} # 读取文件内容作为属性值

二、命令行 / 系统级配置来源

1. 命令行参数(最高优先级之一)

说明

启动java -jar时通过--key=value直接传递配置,会覆盖所有其他来源的同名属性。

示例

bash

运行

# 直接指定端口、数据库密码 java -jar app.jar --server.port=8082 --spring.datasource.password=cmd123

yml 中无需额外配置,SpringBoot 会自动识别这些参数,代码中可通过@Value("${server.port}")获取。

2. JVM 系统属性(-D 参数)

说明

通过java -Dkey=value -jar传递系统属性,SpringBoot 会将其纳入配置上下文,优先级高于环境变量。

示例

bash

运行

# 设置JVM系统属性,同时启动应用 java -Dspring.datasource.url=jdbc:mysql://192.168.1.100:3306/test -Dapp.env=prod -jar app.jar

yml 中引用:

yaml

spring: datasource: url: ${spring.datasource.url} # 引用-D传递的系统属性 app: env: ${app.env:dev} # 引用,默认值dev

3. JDK/JVM 内置系统属性

说明

SpringBoot 可直接引用 JDK 自带的系统属性(如 JDK 版本、操作系统、临时目录等),无需手动配置。

示例

yaml

# 引用JDK内置系统属性 app: jdk: version: ${java.version} # JDK版本,如17.0.8 home: ${java.home} # JDK安装目录 os: name: ${os.name} # 操作系统名称,如Linux/macOS temp: dir: ${java.io.tmpdir} # 系统临时目录

三、环境变量相关配置来源

1. 操作系统环境变量

说明

读取操作系统的环境变量(Linux/macOS 用export KEY=VALUE,Windows 用set KEY=VALUE),SpringBoot 会自动将环境变量转换为配置属性(支持下划线转驼峰 / 点分隔)。

示例
  • 先设置环境变量:

    bash

    运行

    # Linux/macOS export SPRING_DATASOURCE_PASSWORD=env123 export APP_PORT=8083
  • yml 中引用:

    yaml

    spring: datasource: password: ${SPRING_DATASOURCE_PASSWORD} # 直接引用环境变量 server: port: ${APP_PORT:8080} # 引用,默认值8080
    ✨ 注意:环境变量名称建议用大写 + 下划线,SpringBoot 会自动匹配spring.datasource.passwordSPRING_DATASOURCE_PASSWORD

2. Docker Run 传递环境变量

说明

docker run时通过-e参数传递环境变量,容器内的 SpringBoot 应用会读取这些变量,本质是操作系统环境变量。

示例

bash

运行

# docker run 传递环境变量 docker run -d \ -e SPRING_PROFILES_ACTIVE=prod \ -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/test \ -e SPRING_DATASOURCE_PASSWORD=docker123 \ -p 8080:8080 \ your-app:1.0

yml 中引用方式和操作系统环境变量完全一致:

yaml

spring: profiles: active: ${SPRING_PROFILES_ACTIVE:dev} datasource: url: ${SPRING_DATASOURCE_URL} password: ${SPRING_DATASOURCE_PASSWORD}

3. Docker Compose 配置环境变量

说明

docker-compose.yml中通过environment配置环境变量,启动容器时自动注入,原理同docker run -e

示例

yaml

# docker-compose.yml version: '3' services: springboot-app: image: your-app:1.0 ports: - "8080:8080" environment: - SPRING_PROFILES_ACTIVE=prod - SPRING_DATASOURCE_URL=jdbc:mysql://mysql-service:3306/test - SPRING_DATASOURCE_PASSWORD=compose123 depends_on: - mysql-service

4. K8s Secret/ConfigMap(环境变量 / 挂载文件)

说明

K8s 中通过 Secret(敏感信息)/ConfigMap(非敏感信息)注入配置,有两种方式:环境变量注入配置文件挂载

示例 1:环境变量注入(最常用)

K8s Deployment 配置(参考上一轮内容):

yaml

# 部分配置 spec: containers: - name: app env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: app-secret key: db-password - name: DB_URL valueFrom: configMapKeyRef: name: app-config key: db-url

yml 中引用:

yaml

spring: datasource: url: ${DB_URL} password: ${DB_PASSWORD}
示例 2:配置文件挂载(适合大量配置)

K8s 将 ConfigMap 挂载为容器内的 yml 文件,SpringBoot 加载该文件:

yaml

# K8s Deployment 挂载配置 spec: containers: - name: app volumeMounts: - name: app-config-volume mountPath: /opt/config # 挂载到容器目录 volumes: - name: app-config-volume configMap: name: app-config items: - key: application-prod.yml path: application-prod.yml # ConfigMap中的key对应挂载后的文件名

启动命令指定挂载的配置文件:

bash

运行

java -jar app.jar --spring.config.location=/opt/config/application-prod.yml

四、配置中心来源(Nacos/Apollo/Spring Cloud Config)

1. Nacos 配置中心

说明

集成 Nacos 后,SpringBoot 会从 Nacos 服务器拉取配置,优先级高于本地配置,支持动态刷新。

步骤 & 示例
  1. 引入 Nacos 依赖(pom.xml):

    xml

    <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2022.0.0.0-RC2</version> </dependency>
  2. 配置bootstrap.yml(必须用 bootstrap,加载优先级更高):

    yaml

    spring: application: name: app-demo # Nacos 配置DataId的前缀 cloud: nacos: config: server-addr: 192.168.1.200:8848 # Nacos服务地址 file-extension: yml # 配置文件格式 namespace: prod # 命名空间(环境隔离) group: DEFAULT_GROUP # 配置分组
  3. Nacos 控制台配置内容(DataId:app-demo-prod.yml):

    yaml

    spring: datasource: password: nacos123 app: env: prod
  4. 本地 yml 引用(Nacos 配置会覆盖本地同名属性):

    yaml

    spring: datasource: password: ${spring.datasource.password:local123} # 优先用Nacos的配置

2. Spring Cloud Config 配置中心

说明

基于 Git/SVN 存储配置,SpringBoot 从 Config Server 拉取配置。

示例
  1. 引入依赖:

    xml

    <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
  2. bootstrap.yml 配置:

    yaml

    spring: cloud: config: uri: http://192.168.1.201:8888 # Config Server地址 name: app-demo # 配置文件名 profile: prod # 环境 label: master # Git分支
  3. Config Server 端的 Git 配置文件(app-demo-prod.yml):

    yaml

    app: config: value: from-config-server
  4. 本地 yml 引用:

    yaml

    app: config: value: ${app.config.value:local-value}

五、从 pom.xml 读取配置(资源过滤)

说明

通过 Maven/Gradle 的资源过滤功能,将 pom.xml 中的属性(如版本、自定义属性)注入到 yml 配置文件中,打包时自动替换。

示例
  1. pom.xml 中定义属性:

    xml

    <properties> <app.version>1.0.0</app.version> <db.url>jdbc:mysql://localhost:3306/test</db.url> </properties> <!-- 开启资源过滤(关键) --> <build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> # 开启过滤 </resource> </resources> </build>
  2. yml 中引用 pom.xml 属性(用@key@而非${key}):

    yaml

    app: version: @app.version@ # 引用pom中的版本 spring: datasource: url: @db.url@ # 引用pom中的数据库地址
  3. 打包后,yml 文件中的@app.version@会被替换为1.0.0

六、自定义配置源(编程式加载)

说明

通过实现 SpringBoot 的EnvironmentPostProcessorPropertySource接口,自定义配置加载逻辑(如从数据库、Redis、自定义文件读取),优先级最高。

示例(从 Redis 读取配置)
  1. 实现EnvironmentPostProcessor

    java

    运行

    import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import redis.clients.jedis.Jedis; import java.util.HashMap; import java.util.Map; public class RedisConfigPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { // 连接Redis读取配置 try (Jedis jedis = new Jedis("192.168.1.202", 6379)) { Map<String, Object> redisConfig = new HashMap<>(); redisConfig.put("spring.datasource.password", jedis.get("db.password")); redisConfig.put("app.redis.config", jedis.get("app.config")); // 将Redis配置添加到环境中 environment.getPropertySources().addFirst(new MapPropertySource("redisConfig", redisConfig)); } } }
  2. 注册自定义处理器(在META-INF/spring.factories中):

    properties

    org.springframework.boot.env.EnvironmentPostProcessor=com.example.config.RedisConfigPostProcessor
  3. yml 中引用:

    yaml

    spring: datasource: password: ${spring.datasource.password:default} app: redis: config: ${app.redis.config}

总结

  1. 核心引用语法:SpringBoot 配置引用统一用${key:默认值},仅 pom.xml 资源过滤用@key@
  2. 优先级关键:命令行参数 > 系统属性(-D) > 环境变量(Docker/K8s) > 配置中心 > 外部配置文件 > 项目内配置 > 内置默认;
  3. 场景适配
    • 本地开发:用项目内分环境配置(dev.yml);
    • 容器化部署(Docker/K8s):优先用环境变量注入(Secret/ConfigMap);
    • 分布式环境:用 Nacos/Apollo 配置中心(支持动态刷新);
    • 特殊需求:用自定义配置源(从 Redis / 数据库读取)。

通过以上方式,你可以灵活地从不同来源加载 SpringBoot 配置,实现「配置与代码解耦」「环境隔离」「动态配置」的生产级需求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:13:10

MFC CSocket OnReceive使用教程:网络数据接收与粘包处理

MFC中的CSocket类及其OnReceive函数是进行Windows平台网络编程的关键部分。它封装了底层套接字通信的复杂性&#xff0c;使得开发者能够以事件驱动的方式处理网络数据到达。理解并正确使用OnReceive&#xff0c;是构建稳定、高效网络应用的基础。 MFC CSocket OnReceive函数如何…

作者头像 李华
网站建设 2026/4/18 5:13:59

终焉轮回里,藏着 AI 与人类的答案

当大模型在强化学习的迭代中突破能力边界&#xff0c;当 AGI从技术构想走向落地前夜&#xff0c;人类正以代码为祭品&#xff0c;举办一场跨越次元的「造神仪式」。悬疑作品《十日终焉》中的十日轮回死亡游戏&#xff0c;用血色试炼解构了「创造者与被创造者」的核心矛盾&#…

作者头像 李华
网站建设 2026/4/18 1:57:57

收藏!小白程序员也能看懂的大模型——阿里Qwen3系列深度解析

本文深入解析阿里Qwen3系列大模型的技术架构革新&#xff0c;基于Transformer架构&#xff0c;对注意力机制、网络层设计等多维度进行优化&#xff0c;并创新性地融入混合专家&#xff08;MoE&#xff09;架构与动态推理模式。文章通过“消融测试”方法&#xff0c;剖析Transfo…

作者头像 李华
网站建设 2026/4/18 5:14:06

Canvas修改像素点教程:从获取到性能优化全解析

使用Canvas进行图像处理时&#xff0c;直接操作像素点是最底层的核心能力。这让你能实现滤镜、特效、图像分析等高级功能&#xff0c;而不必依赖现成的库。理解其基本原理和性能要点&#xff0c;是进行高效开发的关键。 Canvas如何获取和修改单个像素点 修改像素点的第一步是获…

作者头像 李华
网站建设 2026/4/18 5:13:07

Linux 服务器故障急救指南:CPU、内存、磁盘满员怎么办?

做测试的兄弟们肯定都遇到过&#xff1a;刚才还好好的接口&#xff0c;突然超时报错&#xff1b;测试环境突然像死机一样&#xff0c;命令都敲不动。这时候别慌&#xff0c;不用马上喊运维&#xff0c;用这套“急救”命令清单&#xff0c;3分钟快速定位是代码Bug还是资源耗尽。…

作者头像 李华
网站建设 2026/4/7 14:29:42

Hadoop MapReduce 计算框架详解

一、MapReduce框架概述1、MapReduce概述关于MapReduce的简单介绍可以参考官方文档的说明&#xff1a;Hadoop MapReduce is a software framework for easily writing applications which process vast amounts of data (multi-terabyte data-sets) in-parallel on large cluste…

作者头像 李华