springBoot配置参数的方式和优先级

  1. application.yml/application-dev.yml(项目配置文件)
  2. 系统环境变量(操作系统全局环境变量)
  3. JVM 启动参数 -Dspring.kafka.bootstrap-servers=xxx
  4. 命令行启动参数 --spring.kafka.bootstrap-servers=xxx

Binder 会按优先级从高到低合并,高优先级值覆盖低优先级。

四种配置来源完整介绍、优先级、用法、底层原理

统一前提:所有配置最终都会存入 Spring 的 Environment,由 Binder 绑定到 KafkaProperties;优先级从低到高:yml 文件 < 系统环境变量 < JVM -D 参数 < 命令行 -- 参数,高优先级会覆盖低优先级同名配置。

一、application.yml/application-dev.yml(项目本地配置文件)

  1. 是什么

Spring Boot 标准外部配置文件,放在 src/main/resources 下。

application.yml:公共基础配置,所有环境共用;

application-dev.yml/application-prod.yml:多环境细分配置,通过 spring.profiles.active=dev 激活。

  1. 写法示例

application.yml

yaml

spring:

kafka:

bootstrap-servers: 127.0.0.1:9092

producer:

acks: 1

application-dev.yml(开发环境覆盖)

yaml

spring:

kafka:

bootstrap-servers: 192.168.1.100:9092

  1. 加载时机

容器启动早期由 ConfigFileApplicationListener 加载,是最低优先级,会被后面三类全部覆盖。

  1. 特点

版本可控,提交 Git,统一团队基础配置;

适合固定不变、通用的基础参数;

多环境拆分,避免配置写死在代码;

不适合存放密码、线上真实地址(容易泄露)。

  1. 命名兼容规则

yml 支持短横线 bootstrap-servers,自动映射实体类驼峰 bootstrapServers。

二、操作系统全局环境变量

  1. 是什么

操作系统层面的环境变量,Windows、Linux、Mac 均可配置,进程启动时继承。

Spring 会自动把变量名大写、下划线映射到配置 key:

spring.kafka.bootstrap-servers → SPRING_KAFKA_BOOTSTRAP_SERVERS

  1. Linux 示例

临时生效(当前终端)

bash

运行

export SPRING_KAFKA_BOOTSTRAP_SERVERS=10.0.0.5:9092

java -jar app.jar

永久生效:写入 /etc/profile 或服务配置文件。

  1. Windows 示例

系统环境变量新建:SPRING_KAFKA_BOOTSTRAP_SERVERS=10.0.0.5:9092,重启终端 / 服务生效。

  1. 优先级

高于 yml 文件,低于 JVM -D 参数、命令行参数。

  1. 适用场景

容器化部署(Docker/K8s)、云服务器,通过环境变量注入线上真实地址、密钥;

优势:不用修改打包后的 jar 包,部署时动态注入,敏感配置不进代码仓库。

三、JVM 启动参数 -Dspring.kafka.bootstrap-servers=xxx

  1. 是什么

JVM 系统属性,通过 java -Dkey=value 传入,属于 JVM 层面参数,程序内可用 System.getProperty() 读取。

  1. 使用示例

bash

运行

java -Dspring.kafka.bootstrap-servers=10.0.0.6:9092 -jar demo.jar

  1. 优先级

高于系统环境变量,低于命令行 -- 参数。

  1. 底层原理

Spring 会把所有 JVM System Properties 加入 Environment 的 SystemPropertiesPropertySource,优先级高于系统环境变量源。

  1. 特点

仅对当前这条启动命令生效;

IDEA 运行配置里的 VM Options 就是该参数;

适合临时调试、本地启动覆盖 yml 地址;

缺点:写在启动脚本里仍有泄露风险。

JVM 参数 -Dxxx / -Xmx / -Xms 配置位置,分 IDEA 本地、服务器部署、容器三类场景

一、IDEA 本地开发(最常用)

顶部运行下拉框 → Edit Configurations...

选中你的 SpringBoot Application 启动配置

找到 VM options 输入框,在这里填写 JVM 参数

plaintext

-Dspring.kafka.bootstrap-servers=192.168.1.100:9092

-Xms512m

-Xmx1024m

关键区分两个输入框,不要填错

VM options:JVM 参数,以 -D、-X、-XX 开头

快速记忆

‌-D‌ 给‌代码‌用(配置信息)。

‌-X‌ 给‌内存‌用(基础资源)。

‌-XX‌ 给‌调优‌用(底层机制)。

Program arguments:Spring 程序参数,以 -- 开头

如果看不到 VM options 输入框:点击配置界面左上角 Modify options → 勾选 Add VM options

二、Linux 服务器 java -jar 启动

JVM 参数写在 -jar 前面

  1. 直接命令执行

bash

运行

java -Dspring.kafka.bootstrap-servers=10.0.0.5:9092 -Xms512m -Xmx1g -jar demo.jar

  1. 写入启动脚本 start.sh

bash

运行

#!/bin/bash

JAVA_OPTS="-Dspring.kafka.bootstrap-servers=10.0.0.5:9092 -Xms512m -Xmx1g"

java $JAVA_OPTS -jar /opt/app/demo.jar

  1. systemd 服务文件 /etc/systemd/system/app.service

ini

Service

ExecStart=/usr/bin/java -Dspring.kafka.bootstrap-servers=10.0.0.5:9092 -Xms512m -Xmx1g -jar /opt/app/demo.jar

三、Docker / K8s 容器配置 JVM 参数

Dockerfile

dockerfile

ENTRYPOINT "java","-Dspring.kafka.bootstrap-servers=10.0.0.5:9092","-Xms512m","-jar","app.jar"

K8s deployment.yaml

yaml

env:

  • name: JAVA_TOOL_OPTIONS

value: "-Dspring.kafka.bootstrap-servers=10.0.0.5:9092 -Xms512m"

JAVA_TOOL_OPTIONS 环境变量会被 JVM 自动识别为启动参数。

四、Maven/Gradle 插件运行时配置(mvn spring-boot:run)

Maven pom.xml

xml

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<configuration>

<jvmArguments>-Dspring.kafka.bootstrap-servers=127.0.0.1:9092 -Xmx512m</jvmArguments>

</configuration>

</plugin>

Gradle build.gradle

groovy

bootRun {

jvmArgs '-Dspring.kafka.bootstrap-servers=127.0.0.1:9092', '-Xmx512m'

}

五、补充说明

-Dkey=value 是 JVM 系统属性,代码中可用 System.getProperty("spring.kafka.bootstrap-servers") 读取;

JVM 参数优先级:高于 yml、系统环境变量,低于 -- 命令行参数;

内存、GC、调试端口等 -X/-XX 类 JVM 参数,同样全部放在 VM options /jar 前。

四、命令行启动参数 --spring.kafka.bootstrap-servers=xxx

  1. 是什么

Spring Boot 专属命令行参数,放在 java -jar xxx.jar 之后,以 --key=value 标识。

  1. 使用示例

bash

运行

java -jar demo.jar --spring.kafka.bootstrap-servers=10.0.0.7:9092

  1. 优先级

全局最高,会覆盖前面所有 yml、环境变量、-D 参数。

  1. 底层原理

SpringApplication.run() 启动时解析命令行参数,存入 CommandLinePropertySource,Spring 设计该源优先级最高,用于运维临时紧急覆盖配置。

  1. 适用场景

线上临时切换 Kafka 集群地址;

测试环境临时切换配置,不改动脚本、环境变量;

CI/CD 流水线动态传参。

命令行参数配置

分两种场景:本地 IDEA 开发、服务器 java -jar 线上部署,分开讲命令行 --xxx 参数的配置位置。

一、IDEA 本地运行(配置 --spring.xxx 命令行参数)

  1. 打开运行配置

顶部工具栏启动按钮旁下拉 → Edit Configurations...

  1. 找到对应 SpringBoot 启动类配置

在 Application 分类下选中你的项目启动类。

  1. 填写命令行参数位置:Program arguments

找到输入框 Program arguments,在这里直接写 -- 开头的参数:

plaintext

--spring.kafka.bootstrap-servers=192.168.1.100:9092

--spring.kafka.producer.acks=1

--spring.profiles.active=dev

区分两个容易混淆的输入框:

VM options:放 -Dxxx JVM 参数(JVM 层面)

Program arguments:放 --xxx Spring 命令行参数(程序启动参数)

  1. 保存重启项目即可生效

二、服务器部署 java -jar 方式(脚本里配置)

直接写在 jar 包后面,空格分隔多个参数。

示例 1:直接命令执行

bash

运行

java -jar kafka-demo.jar --spring.kafka.bootstrap-servers=10.0.0.5:9092 --spring.profiles.active=prod

示例 2:写入启动脚本 start.sh(运维常用)

bash

运行

#!/bin/bash

java -jar /opt/app/kafka-demo.jar \

--spring.kafka.bootstrap-servers=10.0.0.5:9092 \

--spring.kafka.consumer.group-id=prod-group

执行脚本启动:

bash

运行

sh start.sh

示例 3:systemd 服务文件配置

编辑 /etc/systemd/system/app.service

ini

Service

ExecStart=/usr/bin/java -jar /opt/app/kafka-demo.jar --spring.kafka.bootstrap-servers=10.0.0.5:9092

重载并重启服务:

bash

运行

systemctl daemon-reload

systemctl restart app

三、Docker / K8s 容器场景配置命令行参数

Dockerfile

dockerfile

ENTRYPOINT "java","-jar","app.jar"

CMD "--spring.kafka.bootstrap-servers=10.0.0.5:9092"

K8s yaml

yaml

args:

  • "--spring.kafka.bootstrap-servers=10.0.0.5:9092"

四、补充区分容易搞混的两种参数位置

JVM 参数 -Dxxx → VM options /java 命令 jar 包之前

bash

运行

java -Dspring.kafka.xxx=xxx -jar app.jar

Spring 命令行参数 --xxx → Program arguments /jar 包之后

bash

运行

java -jar app.jar --spring.kafka.xxx=xxx

五、完整优先级排序(由低→高,后者覆盖前者)

application.yml / application-{profile}.yml

操作系统环境变量(SPRING_KAFKA_XXX)

JVM -D 系统属性(-Dspring.kafka.xxx)

jar 包后命令行 -- 参数(--spring.kafka.xxx)

六、覆盖演示示例

全部同时配置:

yml:127.0.0.1:9092

系统环境变量:10.0.0.5:9092

JVM -D:10.0.0.6:9092

-- 命令行:10.0.0.7:9092

程序最终读到的 bootstrap-servers = 10.0.0.7:9092,最高优先级生效。

七、核心底层统一流程

四类配置全部加载到 Environment,分不同 PropertySource,自带优先级;

ConfigurationPropertiesBindingPostProcessor 触发绑定;

Binder 按优先级从高到低合并同名 key;

最终反射赋值给 KafkaProperties,供 Kafka 自动配置读取创建生产者 / 消费者。