- application.yml/application-dev.yml(项目配置文件)
- 系统环境变量(操作系统全局环境变量)
- JVM 启动参数
-Dspring.kafka.bootstrap-servers=xxx - 命令行启动参数
--spring.kafka.bootstrap-servers=xxx
Binder 会按优先级从高到低合并,高优先级值覆盖低优先级。
四种配置来源完整介绍、优先级、用法、底层原理
统一前提:所有配置最终都会存入 Spring 的 Environment,由 Binder 绑定到 KafkaProperties;优先级从低到高:yml 文件 < 系统环境变量 < JVM -D 参数 < 命令行 -- 参数,高优先级会覆盖低优先级同名配置。
一、application.yml/application-dev.yml(项目本地配置文件)
- 是什么
Spring Boot 标准外部配置文件,放在 src/main/resources 下。
application.yml:公共基础配置,所有环境共用;
application-dev.yml/application-prod.yml:多环境细分配置,通过 spring.profiles.active=dev 激活。
- 写法示例
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
- 加载时机
容器启动早期由 ConfigFileApplicationListener 加载,是最低优先级,会被后面三类全部覆盖。
- 特点
版本可控,提交 Git,统一团队基础配置;
适合固定不变、通用的基础参数;
多环境拆分,避免配置写死在代码;
不适合存放密码、线上真实地址(容易泄露)。
- 命名兼容规则
yml 支持短横线 bootstrap-servers,自动映射实体类驼峰 bootstrapServers。
二、操作系统全局环境变量
- 是什么
操作系统层面的环境变量,Windows、Linux、Mac 均可配置,进程启动时继承。
Spring 会自动把变量名大写、下划线映射到配置 key:
spring.kafka.bootstrap-servers → SPRING_KAFKA_BOOTSTRAP_SERVERS
- Linux 示例
临时生效(当前终端)
bash
运行
export SPRING_KAFKA_BOOTSTRAP_SERVERS=10.0.0.5:9092
java -jar app.jar
永久生效:写入 /etc/profile 或服务配置文件。
- Windows 示例
系统环境变量新建:SPRING_KAFKA_BOOTSTRAP_SERVERS=10.0.0.5:9092,重启终端 / 服务生效。
- 优先级
高于 yml 文件,低于 JVM -D 参数、命令行参数。
- 适用场景
容器化部署(Docker/K8s)、云服务器,通过环境变量注入线上真实地址、密钥;
优势:不用修改打包后的 jar 包,部署时动态注入,敏感配置不进代码仓库。
三、JVM 启动参数 -Dspring.kafka.bootstrap-servers=xxx
- 是什么
JVM 系统属性,通过 java -Dkey=value 传入,属于 JVM 层面参数,程序内可用 System.getProperty() 读取。
- 使用示例
bash
运行
java -Dspring.kafka.bootstrap-servers=10.0.0.6:9092 -jar demo.jar
- 优先级
高于系统环境变量,低于命令行 -- 参数。
- 底层原理
Spring 会把所有 JVM System Properties 加入 Environment 的 SystemPropertiesPropertySource,优先级高于系统环境变量源。
- 特点
仅对当前这条启动命令生效;
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 前面
- 直接命令执行
bash
运行
java -Dspring.kafka.bootstrap-servers=10.0.0.5:9092 -Xms512m -Xmx1g -jar demo.jar
- 写入启动脚本 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
- 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
- 是什么
Spring Boot 专属命令行参数,放在 java -jar xxx.jar 之后,以 --key=value 标识。
- 使用示例
bash
运行
java -jar demo.jar --spring.kafka.bootstrap-servers=10.0.0.7:9092
- 优先级
全局最高,会覆盖前面所有 yml、环境变量、-D 参数。
- 底层原理
SpringApplication.run() 启动时解析命令行参数,存入 CommandLinePropertySource,Spring 设计该源优先级最高,用于运维临时紧急覆盖配置。
- 适用场景
线上临时切换 Kafka 集群地址;
测试环境临时切换配置,不改动脚本、环境变量;
CI/CD 流水线动态传参。
命令行参数配置
分两种场景:本地 IDEA 开发、服务器 java -jar 线上部署,分开讲命令行 --xxx 参数的配置位置。
一、IDEA 本地运行(配置 --spring.xxx 命令行参数)
- 打开运行配置
顶部工具栏启动按钮旁下拉 → Edit Configurations...
- 找到对应 SpringBoot 启动类配置
在 Application 分类下选中你的项目启动类。
- 填写命令行参数位置: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 命令行参数(程序启动参数)
- 保存重启项目即可生效
二、服务器部署 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 自动配置读取创建生产者 / 消费者。