spring boot 的 ${random.*} 是其 propertysource 解析机制提供的随机值生成器,非 yaml 原生语法,仅在 spring boot 环境中生效于配置属性值,支持 value、int、long、uuid、string 等形式,每次启动动态生成,适用于开发测试场景。

Spring Boot 的 application.yml 中,${random.*} 是 Spring Boot 提供的内置随机值生成器,用于在配置加载时动态生成随机字符串、数字等,**不是 YAML 语法本身支持的功能,而是 Spring Boot 的 PropertySource 解析机制实现的**。它只能在 Spring Boot 环境中生效,且仅适用于配置属性(如 spring.profiles.active、自定义属性等),不能用于 YAML 的结构(比如 map key 或 list item 名称)。
支持的 random 表达式类型
Spring Boot 内置的 random 属性源支持以下常用形式:
-
${random.value}:随机 32 位 hex 字符串(如4e2f8a1c9b3d...) -
${random.int}:随机 int(32 位有符号整数) -
${random.long}:随机 long -
${random.int(10)}:0 到 9 的随机整数(含下界,不含上界) -
${random.int[10,20]}:10 到 19 的随机整数(方括号表示闭区间,即含两端) -
${random.uuid}:随机 UUID 字符串(如550e8400-e29b-41d4-a716-446655440000) -
${random.string(8)}:长度为 8 的随机字母数字字符串
在 application.yml 中的正确写法
直接在属性值中使用 ${random.*} 即可,Spring Boot 会在启动时解析并替换:
server:
port: ${random.int[8000,9000]}
<p>app:
secret-key: ${random.uuid}
token-salt: ${random.string(16)}
retry-max: ${random.int(3,6)} # 3~5 的整数(注意:闭区间写法是 [3,6),但推荐用 [min,max] 更明确)</p><p>spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password: ${random.value}
</p>
✅ 这些值每次启动应用都会重新生成,适合用于本地开发、测试环境的临时密钥、端口、数据库密码等。
注意事项与常见问题
以下情况会导致 ${random.*} 不生效或报错:
- 不在 Spring Boot 项目中:纯 Java + YAML 解析库(如 SnakeYAML)不识别该语法,会原样保留字符串
-
写在非属性值位置:例如作为 map key:
${random.uuid}: value❌ 不支持,YAML 键名必须是静态字面量 -
嵌套在复杂表达式里未被识别:如
${random.int() + 100}❌ 不支持算术运算,仅支持基础随机函数调用 -
配置文件未被 Spring Boot 加载:确认文件名为
application.yml(或application-{profile}.yml),且位于src/main/resources/ -
与其他占位符冲突:如
${random.int}:${random.int}是合法的,但${random.int:${default}}中的默认值不支持嵌套 random
替代方案:需要更复杂逻辑时怎么办?
若需组合字符串、条件判断或多次复用同一随机值,${random.*} 不够用,可考虑:
- 在
@ConfigurationProperties类中用@PostConstruct或构造器生成一次随机值并缓存 - 使用
@Value("${random.uuid}")注入到 Bean 中,再在代码里加工 - 通过
ApplicationContextInitializer在上下文刷新前预设系统属性(如System.setProperty("my.random", UUID.randomUUID().toString())),再用${my.random}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











