Spring Boot 随机值与占位符
Spring Boot支持配置中使用随机值和占位符引用其他属性。
随机值配置
随机数生成
YAML
my:
random:
int: ${random.int}
int-range: ${random.int[100,200]} # 100-200随机整数
long: ${random.long}
uuid: ${random.uuid} # UUID字符串
value: ${random.value} # 随机字符串
使用示例
Java
@ConfigurationProperties(prefix = "my.random")
public class RandomProperties {
private int intRange;
private String uuid;
// getters and setters
}
YAML
# 常见用途
app:
id: ${random.uuid}
secret-key: ${random.value}
port: ${random.int[1024,65535]}
占位符引用
引用其他属性
YAML
app:
name: myapp
version: 1.0.0
full-name: ${app.name}-${app.version} # myapp-1.0.0
database:
url: jdbc:mysql://${db.host}:${db.port}/mydb
host: localhost
port: 3306
默认值
YAML
# 如果属性不存在,使用默认值
app:
name: ${APP_NAME:default-name}
port: ${PORT:8080}
timeout: ${TIMEOUT:3000}
# 冒号后为默认值
# 格式:${property-name:default-value}
引用系统属性和环境变量
YAML
# 系统属性
app:
home: ${java.io.tmpdir}
version: ${java.specification.version}
# 环境变量
app:
user: ${USER}
home-dir: ${HOME}
占位符解析器
Java
// PropertyPlaceholderConfigurer解析占位符
// EnvironmentPlaceholderResolver处理${...}格式
public class PropertySourcesPlaceholderConfigurer extends PlaceholderConfigurerSupport {
// 解析${property:default}
// 1. 从Environment查找property
// 2. 未找到则使用default
// 3. 无default且property不存在则抛异常
}
@Value中使用占位符
Java
@Component
public class MyService {
@Value("${app.name}")
private String appName;
@Value("${app.timeout:5000}")
private int timeout; // 默认值5000
@Value("${random.uuid}")
private String id;
}
配置文件组合使用
YAML
# 基础配置
server:
port: 8080
# 开发环境
spring:
config:
activate:
on-profile: dev
server:
port: ${SERVER_PORT:8081} # 环境变量优先,默认8081
# 生产环境
spring:
config:
activate:
on-profile: prod
server:
port: ${SERVER_PORT} # 无默认值,必须提供环境变量
占位符嵌套
YAML
# 占位符可嵌套
app:
env: prod
config-dir: /config/${app.env}/
full-path: ${app.config-dir}settings.yml # /config/prod/settings.yml
随机值底层实现
Java
// RandomValuePropertySource
public class RandomValuePropertySource extends PropertySource<Void> {
public static final String RANDOM_PROPERTY_SOURCE_NAME = "random";
@Override
public Object getProperty(String name) {
if (name.startsWith("random.")) {
// 解析random.int、random.uuid等
return generateRandomValue(name);
}
return null;
}
}
随机值应用场景
| 场景 | 示例 |
|---|---|
| 应用ID | ${random.uuid} |
| 随机端口 | ${random.int[1024,65535]} |
| 密钥生成 | ${random.value} |
| 测试数据 | ${random.int} |
注意事项
YAML
# 占位符未定义且无默认值,启动报错
app:
name: ${undefined-property} # 报错
# 空字符串作为默认值
app:
name: ${undefined-property:} # 默认空字符串
要点总结
- ${random.int/long/uuid/value}生成随机值
- ${property}引用其他配置属性
- ${property:default}指定默认值
- 占位符支持嵌套和组合
- @Value中可使用占位符和随机值
- 未定义属性无默认值会报错
📝 发现内容有误?点击此处直接编辑