在spring的xml配置文件或@Value注解中,我们经常看到${}符合表示的属性值,那么它们是如何被解析到的呢?
这里我们就要先谈一下PropertySourcesPlaceholderConfigurer类了。在spring的注释中,有关于这个类的说明。从Spring 3.1开始,优先使用PropertySourcesPlaceholderConfigurer解析,在Spring 3.1之前,使用了PropertyPlaceholderConfigurer解析。
在YamlPropertySourceLoader的load方法中,会调用YamlProcessor的process(),在process中会调用getFlattenedMap()方法,这里会进行解析。将数据解析成key,value的形式,存放在Properties中。接着调用matches(Properties properties)方法,会调用propertySources.addFirst()将配置文件数据信息存放在propertySources中。

然后调用new PropertySourcesPropertyValues(propertySources)将配置文件数据传递到PropertySourcesPropertyValues对象中。

在PropertySourcesPropertyValues中又会通过new PropertySourcesPropertyResolver(propertySources)将propertySources传递给PropertySourcesPropertyResolver对象中,接着调用processPropertySource(source, resolver);来获取所有的key的值。

这里会先获取所有的key,然后循环去调用PropertySourcesPropertyResolver的getProperty()方法。

由于前面已经将propertySouces的值传递到PropertySourcesPropertyResolver对象了,因此这里就可以获取到key对应的value。这里还会进行嵌套占位符的处理。也就是调用resolveNestedPlaceholders()方法。如果配置文件里的value中也有${}这样的形式,那么就会调用resolveNestedPlaceholders()。
