在使用ClassPathXmlApplicationContext 传入配置文件时,解析配置文件的流程如下:
AbstractRefreshableConfigApplicationContext.resolvePath
getEnvironment() -> createEnvironment() -> StandardEnvironment
实例化StandardEnvironment 时 调用customizePropertySources函数
customizePropertySources时加入MapPropertySource ,SystemEnvironmentPropertySource
调用StandardEnvironment父类AbstractEnvironment.resolveRequiredPlaceholders
内部调用PropertySourcesPropertyResolver父类AbstractPropertyResolver的
resolveRequiredPlaceholders,此时propertySources传入PropertySourcesPropertyResolver调用doResolvePlaceholders 传入this::getPropertyAsRawString,实际就是
,PropertySourcesPropertyResolver的getProperty方法作为函数式接口PlaceholderResolver的 参数
阅读随记:
- CopyOnWriteArrayList 内部indexOf是根据传入的对象的equals方法来比较
- PropertySource.named返回的ComparisonPropertySource 只会比较两个对象的name
- jdk里AbstractCollection的toString方法