Spring Boot 源码研读之ConfigurableEnvironment 环境准备

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

相关推荐
东风破_6 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
嘻哈∠※6 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
卷无止境6 小时前
在 awesome-fastapi 里,哪些库值得一看?
后端·python
白狐_7987 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2587 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
卷无止境7 小时前
FastAPI 的Admin面板生态
后端·python
捡田螺的小男孩9 小时前
什么是 Skill?手把手带你写一个简单有用的 Skill!
前端·后端·程序员
IT_陈寒9 小时前
Redis集群这个坑,差点让我通宵
前端·人工智能·后端
极创信息9 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate