运行源码分析:初始化ApplicationArguments

初始化ApplicationArguments监 听 器 启 动 之 后,紧接着便是执行ApplicationArguments对象的初始化, Application-Arguments 是用于提供访问运行 SpringApplication 时的参数 。
ApplicationArguments 的 初 始 化 过 程 非 常 简 单,只 是 调 用 了 它 的 实 现 类Default-ApplicationArguments 并传入 main 方法中的 args 参数 。
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
在 DefaultApplicationArguments 中将参数 args 封装为 Source 对象 , Source 对象是基于Spring 框架的 SimpleCommandLinePropertySource 来实现的 。
我们对该接口在此不进行拓展 , 只需知道通过 main 方法传递进来的参数被封装成ApplicationArguments 对象即可 。 关于该接口实例化的步骤我会在后续关于 Spring Boot 的参数的章节中进行详细讲解 , 因此在图 4-1 所示的核心流程图中也没有体现出来 。
运行源码分析:初始化ApplicationArguments文章插图
初始化 ConfigurableEnvironment完成 ApplicationArguments 参数的准备之后 , 便开始通过 prepareEnvironment 方法对ConfigurableEnvironment 对象进行初始化操作 。
ConfigurableEnvironment接口继承自Environment接口和ConfigurablePropertyResolver , 最终都继承自接口 PropertyResolver 。
ConfigurableEnvironment 接口的主要作用是提供当前运行环境的公开接口 , 比如配置文件profiles 各类系统属性和变量的设置、添加、读取、合并等功能 。
通过 ConfigurableEnvironment 接口中方法定义 , 可以更清楚地了解它的功能 , 代码如下 。
public interface ConfigurableEnvironment extends Environment, Configurable-PropertyResolver{设置激活的组集合void setActiveProfiles(String. .. profiles);向当前激活的组集合中添加一个 profile 组void addActiveProfile(String profile);设置默认激活的组集合 。 激活的组集合为空时会使用默认的组集合void setDefaultProfiles(String... profiles);//获取当前环境对象中的属性源集合 , 也就 是应用环境变量//属性源集合其实就是滚动鼠标轴或单击 , 开始截长图//该方法提供了直接配置属性源的MutablePropertySources getPropertySources();//获取虚拟机环境变量 , 该方法提供 J 直接配置虚拟机环境变量的入口Map getSystemProperties();//获取操作系统环境变量//该方法提供了直接配置系统环境变量的入口Map getSystemEnvironment();合并指定环境中的配置到当前环境中void merge (ConfigurableEnvironment parent);}通过接口提供的方法 , 我们可以看出 ConfigurableEnvironment 就是围绕着这个“环境”来提供相应的功能 , 这也是为什么我们也将它称作“环境” 。
了解了 ConfigurableEnvironment 的功能及方法 , 我们回归到 SpringApplication 的流程看相关源代码 。 run 方 法中调用 prepareEnvironment 方法相关代码如下 。
public ConfigurableApplicationContext run(String... args) {//加载属性配置 , 包括所有的配 置属性(如: application. properties 中和外部的属性配置)ConfigurableEnvironment environment = prepareEnvironment( listeners,applicationArguments);}prepareEnvironment 方法的源代码实现如下 。
private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments) {//获取或创建环境ConfigurableEnvironment environment = getOrCreateEnvironment();//配置环境 ,主要包括 PropertySources lactiveProfiles 的配置configureEnvironment (environment, applicationArguments . getSourceArgs());//将 ConfigurationPropertySources 附加到指定环境中的第一位 ,并动态跟踪环境的添加或删除ConfigurationPropertySources . attach( environment);// listener 环境准备(之前章节已经提到)listeners. environmentPrepared environment);//将环境绑定到 SpringApplicationbindToSpringApplication( environment);//判断是否定制的环境 , 如果不是定制的则将环境转换为 StandardEnvironmentif (!this. isCustomEnvironment) {environment = new EnvironmentConverter(getClassLoader()). convertEnvironmentIfNecess ary(environment, deduceEnvironment -Class());//将 ConfigurationPropertySources 附加到指定环境中的第一位 ,并动态跟踪环境的添加或删除ConfigurationPropertySources . attach( environment);return environment;}通过以上代码及注解可知 , prepareEnvironment 进行 了以下的操作 。
.获取或创建环境 。
.配置环境 。
:ConfigurationPropertySources 附加到指定环境:将 ConfigurationPropertySources 附加到指定环境中的第一位 , 并动态跟踪环境的添加或删除(当 前版本新增了该行代码 , 与最后一步操作相同) 。
.设置 listener 监听事件:前面章节已经讲过 , 此处主要针对准备环境的监听 。
.绑定环境到 SpringApplication:将环境绑定到 name 为“spring.main”的目标上 。