springboot 动态参数
背影
项目中经常会使用很多的配置参数,当某个应用需要单独配置时,需要特殊化参数。
- 如 生产4个节点,3个节点资源配置一样,另1个节点资源比其他3个少,此时使用公共的参数,可能会造成错误如OMM 。
启动命令行参数
Spring Boot 中替换 @Value 参数的核心方式是命令行 -- 参数(推荐)和 JVM -D 系统属性,均无需修改代码;
核心语法:java -jar 项目.jar --配置键=值,键需与 @Value("${键}") 完全一致,支持多级前缀(如 app.upload.maxSize);
优先级:-- 命令行参数 > -D 系统属性 > 配置文件 > @Value 默认值,键重复时高优先级覆盖低优先级;
特殊值处理:包含空格 / 特殊字符的值需用双引号包裹,如 --key="value with space";
关键注意:命令行参数必须写在 jar 包名之后,否则不生效;@Value 建议添加默认值(${键:默认值}),避免找不到键的异常。
# 格式:--配置键=替换值
java -jar 你的项目.jar --user.name=张三 --server.port=8081
优先级
命令行参数 > 系统环境变量 > 配置中心(Nacos/Apollo) > 本地配置文件(application-prod.yml > application.yml) > @Value 默认值
进阶
除了
--命令行参数,还可通过-D系统属性 替换@Value参数,核心区别是:
--是 Spring Boot 专属的应用参数,仅对当前 Spring Boot 应用生效;-D是 JVM 级别的系统属性,对整个 JVM 进程生效,Spring Boot 会自动读取系统属性并绑定到@Value。使用语法
# 格式:java -D配置键=替换值 -jar 项目.jar java -Duser.name=李四 -Dapp.upload.maxSize=4096 -jar demo.jar效果:与
--命令行参数完全一致,@Value("${user.name}")会取到「李四」,优先级同样高于配置文件。