运行源码分析:初始化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 所示的核心流程图中也没有体现出来 。
文章插图
初始化 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”的目标上 。
- 资本|2020年中国人工智能医疗行业发展现状分析 处于成长期且资本热度高
- 硬盘|七八年前的电脑,运行速度缓慢,卡顿,更换两个硬件就能快如闪电
- 用户|密室逃脱行业发展及用户分析报告:哪些人在沉迷密室逃脱?
- 框架|三种数据分析思维框架的构建方法
- 分析师|真香定律或再被验证,iPhone12将大卖,分析师给出两个原因
- 文章|局座张召忠:分析局座历年的文章发现,我发现这些秘密
- 主题|GNN、RL崛起,CNN初现疲态?ICLR 2021最全论文主题分析
- 市场|2020年全球智能手机行业市场竞争格局分析 中国品牌在北美市场缺乏一定优势
- M1|继Windows之后 M1版Mac成功运行Ubuntu
- 时间|19824.66美元!比特币突破近三年高价 分析师:创新高不代表行情将持续上升