Java配置文件中占位符${key}支持单向、非循环、字符串级属性引用,需被引用属性先定义,Spring Boot默认启用且支持默认值、嵌套引用及跨profile复用,但不校验类型或逻辑。

Java 配置文件中可以通过占位符(如 ${key})实现属性之间的引用和复用,前提是使用支持占位符解析的配置加载机制(如 Spring 的 PropertySourcesPlaceholderConfigurer 或 Spring Boot 的自动配置),且引用必须是**单向、非循环、字符串级替换**。
Spring Boot 中的 ${} 占位符引用
Spring Boot 默认启用占位符解析,可在 application.properties 或 application.yml 中直接跨属性引用:
- 基础写法:
server.port=8080→app.base-url=http://localhost:${server.port}/api - 支持嵌套引用:
db.host=localhost→db.url=jdbc:mysql://${db.host}:3306/mydb - 支持默认值:
app.env=${SPRING_PROFILES_ACTIVE:dev},若环境变量未设则用dev
引用顺序与作用域限制
占位符解析按配置加载顺序进行,**被引用的属性必须先定义**(严格按文件内从上到下顺序),否则会报 IllegalArgumentException: Could not resolve placeholder:
- ✅ 正确:先写
redis.host=127.0.0.1,再写redis.url=redis://${redis.host}:6379 - ❌ 错误:把
redis.url写在redis.host上面,解析时找不到redis.host - ⚠️ 注意:
application.yml中的映射结构不影响解析顺序,仍以实际书写行序为准
跨配置文件引用(需显式激活)
不同 profile 文件(如 application-dev.properties)中的属性默认不互通。若需复用主配置中的值:
立即学习“Java免费学习笔记(深入)”;
- 主配置定义通用值:
common.app-name=myapp - profile 文件中直接引用:
logging.file.name=${common.app-name}-log.log - 确保 profile 文件被正确加载(如通过
spring.profiles.active=dev) - Spring Boot 2.4+ 后,
spring.config.import可显式导入其他配置,增强复用能力
避免循环引用与类型安全提醒
占位符仅做字符串替换,不校验逻辑或类型:
- 禁止循环引用:
a=${b}+b=${a}会导致解析失败 - 数值类属性仍为字符串:
timeout.ms=5000→retry.delay=${timeout.ms},后续代码需自行转Integer.parseInt() - 复杂结构(如 List/Map)不支持直接占位符组装,需在代码层处理
不复杂但容易忽略细节,关键是定义顺序、作用域范围和字符串本质。


















