spring|Spring 源码 之Spring IOC 容器 前戏准备工作( 二 )


\t\tthis.active.set(true);\t\t// Initialize any placeholder property sources in the context environment.
\t\t// 初始化上下文环境中的任何占位符属性源
\t\t// 留给子类进行扩展 , 比如添加必须的属性值验证
\t\tinitPropertySources();\t\t// Validate that all properties marked as required are resolvable:
\t\t// see ConfigurablePropertyResolver#setRequiredProperties
\t\t// 获取环境对象 , 并验证需要的属性
\t\tgetEnvironment().validateRequiredProperties();\t\t// Store pre-refresh ApplicationListeners...
\t\t// 准备应用监听器和实践的容器初始化
\t\tif (this.earlyApplicationListeners == null) {\t\t\tthis.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
\t\t\t\telse {\t\t\t// Reset local application listeners to pre-refresh state.
\t\t\t// 如果不为空 , 那么就清空掉 , 并设置新的早期的监听器进去
\t\t\tthis.applicationListeners.clear();\t\t\tthis.applicationListeners.addAll(this.earlyApplicationListeners);
\t\t\t\t// Allow for the collection of early ApplicationEvents
\t\t// to be published once the multicaster is available...
\t\tthis.earlyApplicationEvents = new LinkedHashSet<>();
\t

这里有个问题就是他的环境信息是何时设置进去的呢?
实际上是在容器启动时调用了父类构造函数时设置进去的 ,  Environment 他是一个接口 , 他有个重要的实现类叫 StandardEnvironment  , 在Spring启动的时候就会使用这个类进行环境信息的加载 , 最终他会调用到 System#getProperties 和 System#getenv 方法 , 然后将加载到属性放在Map中进行保存 。
大概的流程如下:

标记的类就是 Environment 环境信息的加载过程调用的类 , 最终会调用到 System#getProperties 和 System#getenv 方法 , 然后完成环境信息的加载 , 主要加载的信息就是系统的环境变量 , 比如在 Windows 中配置的环境变量或者启动类中使用 -D 参数配置的启动参数都会进行加载到 StandardEnvironment 这个类中 , 类似于使用- Dxxx.name=123 这种参数会加载到 systemProperties 中 , 配置的 windows 环境变量会加载 systemEnvironment 中 。
【spring|Spring 源码 之Spring IOC 容器 前戏准备工作】这个就是 Spring IOC 创建的第一个方法的前戏准备工作 , 接下来解读默认的 BeanFactory 实现类 DefaultListableBeanFactory 的创建过程 。