springboot 动态参数

27 阅读1分钟

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}") 会取到「李四」,优先级同样高于配置文件。