如何在@Value注解中组合两个环境变量实现动态配置注入
问题原因
@Value("${END_POINT_URL}.${environment}")写法不生效,核心是占位符语法逻辑错误:
这种写法会被Spring解析为两个独立占位符加字符串拼接:先读取key为END_POINT_URL的配置值(配置中该节点是多层map结构,无直接字符串值),再拼接.字符,最后拼接environment的配置值,最终得到的结果类似{dev=http://sampledev.uk.com, qa=http://sampleqa.uk.com, prod=http://sampleprod.uk.com}.dev,完全不符合嵌套配置的取值逻辑。
正确写法
直接使用Spring占位符的嵌套能力,将动态key放到同一个配置占位符内部即可:
@Value("${END_POINT_URL.${environment}}") private String url;
取值逻辑
Spring处理该注解值时会按从内到外的顺序解析占位符:
- 先解析内层
${environment},拿到当前激活的环境标识(dev/qa/prod三者之一) - 将解析到的环境值拼接到配置路径后,得到完整配置key,例如环境为dev时,最终key为
END_POINT_URL.dev - 读取该完整key对应的配置值,注入到
url字段
容错优化
如果担心应用启动时ZK_ENVIRONMENT变量未传入导致占位符解析报错,可以给内层的环境配置加默认值,例如下方写法会在未读取到environment配置时,默认使用dev环境的地址:
@Value("${END_POINT_URL.${environment:dev}}") private String url;
内容的提问来源于stack exchange,提问作者Shankar
相关产品推荐
相关产品推荐

