1、ConfigurableEnvironment 环境创建
跟踪源码可以看出对于web服务最终创建的是 ApplicationServletEnvironment,以下是ApplicationServletEnvironment 类的结构图。

2、配置环境
让我们继续看看在环境对象创建好后,配置环境具体做了哪些事情。
- 设置转换服务
ApplicationConversionService - 添加命令行参数
key=commandLineArgs - attach(environment )
- 目的 :将创建
ApplicationServletEnvironment时,默认构建的MutablePropertySources包装成SpringConfigurationPropertySources,同时将PropertySource包装成ConfigurationPropertySourcesPropertySource以支持@ConfigurationProperties注解类型的属性源的解析。第二就是将增强后的属性源放到属性源列表的最前面,以便让其优先工作。 - 注意:这里增加解析还得结合
ConfigurationPropertiesBindingPostProcessor实现去看
- 目的 :将创建
3、执行 SpringApplicationRunListener.environmentPrepared
通过 SimpleApplicationEventMulticaster 多播执行实现了 ApplicationListener 接口实现类的 onApplicationEvent 方法。应用事件类型为 ApplicationEnvironmentPreparedEvent。主要用于在环境准备好之后、上下文创建之前处理的一些需要的操作。
4、继续配置环境
-
defaultProperties 配置属性移到最后
-
将环境绑定到 SpringApplication
-
按 *
WebApplicationType*类型进行环境转换 -
再次attach,确保让增强的属性源优先工作
注:spring boot 版本为3.2.3