application.yml配置文件中的配置:
test:
url: ${D_ALG_URL:https://baidu.com}/bb
环境变量中的配置:
EXPORT TEST_URL="aa"
那么
@Value("${test.url}")
private String url;
获取到的值为"aa"
以下为找源码找到的原因
spring源码中
- QualifierAnnotationAutowireCandidateResolver#getSuggestedValue方法
- 找到调用者DefaultListableBeanFactory#doResolveDependency,里面有行代码是
String strVal = this.resolveEmbeddedValue((String)value);
这行代码就是根据value值,也就是"${test.url}",获取value的具体实现
3. 再往下找AbstractBeanFactory#resolveEmbeddedValue,再往下AbstractPropertyResolver#resolveRequiredPlaceholders,再往下PropertyPlaceholderHelper#parseStringValue,以下代码中
String propVal = placeholderResolver.resolvePlaceholder(placeholder);
- 再往下到PropertySourcesPropertyResolver#getPropertyAsRawString,再到getProperty方法,里面有行关键代码
Object value = propertySource.getProperty(key);
这行代码就是具体实现
5. 再往下到PropertySourcesPlaceholderConfigurer#getProperty, 到PropertySourcesPropertyResolver#getProperty方法中会遍历propertySources,找到系统环境变量(OriginAwareSystemEnvironmentPropertySource {name=‘systemEnvironment’})的配置,
也就是SystemEnvironmentPropertySource#resolvePropertyName,会将"test.url"中的".“转为”_",并将小写转化为大写,从而代码中获取到的${test.url}直接变成了系统环境变量中的值