运行源码分析:初始化ApplicationArguments( 二 )
通过以上代码及注解可知 , prepareEnvironment 进行 了以下的操作 。
.获取或创建环境 。
.配置环境 。
:ConfigurationPropertySources 附加到指定环境:将 ConfigurationPropertySources 附加到指定环境中的第一位 , 并动态跟踪环境的添加或删除(当 前版本新增了该行代码 , 与最后一步操作相同) 。
.设置 listener 监听事件:前面章节已经讲过 , 此处主要针对准备环境的监听 。
.绑定环境到 SpringApplication:将环境绑定到 name 为“spring.main”的目标上 。
.转换环境:判断是否是定制的环境 , 如果不是定制的 , 则将环境转换为Standard-Environment 。 此时判断条件 isCustomEnvironment 默认为 false,在后面的操作中会将其设置为 true,如果为 true 则不再会进行此转换操作 。
:ConfigurationPropertySources 附加到指定环境:将 ConfigurationPropertySources 附加到指定环境中的第一位 , 并动态跟踪环境的添加或删除操作 。
下面针对以上步骤挑选部分代码进行相应的讲解 。
文章插图
获取或创建环境
SpringApplication 类中通过 getOrCreateEnvironment 方法来获取或创建环境 。 在该方法中首先判断环境是否为 null , 如果不为 null 则直接返回;如果为 null,则根据前面推断出来的WebApplicationType 类型来创建指定的环境 , 代码如下 。
private Conf igurableEnvironment getOrCreateEnvironment() {if (this. environment != null) {return this . environment;//根据不同的应用类型 ,创建不同的环境实现switch (this . webApplicationType) {case SERVLET:return new StandardServletEnvironment();case REACTIVE:return new StandardReactiveWebEnvironment();default:return new StandardEnvironment();}
. 上面方法中如果 environment 存在 ,则直接返回;如果 environment 不存在 , 则根据前面步骤中推断获得的 WebApplicationType 来进行区分创建环境 。 如果是 SERVLET 项目则创建标准的 Servlet 环境 StandardServletEnvironment;
如果是 REACTIVE 项目则创建 StandardReactiveWebEnvironment;其他情况则创建标准的非 Web 的 StandardEnvironment 。
配置环境
【运行源码分析:初始化ApplicationArguments】在获得环境变量对象之后 , 开始对环境变量和参数进行相应的设置 , 主要包括转换服务的设置、PropertySources 的设置和 activeProfiles 的设置 。
SpringApplication 类中相关 configureEnvironment 方法代码如下 。
protected void configureEnvironment (ConfigurableEnvironment environment,String[] args) {//如果为 true 则获取并设置转换服务f (this. addConversionService) {ConversionService conversionService = ApplicationConversionService. getSharedInstance();environment . setConversionService( (ConfigurableConvers ionService) conversion-Service);//配置 PropertySourcesconfigurePropertySources( environment, args);//配置 ProfilesconfigureProfiles(environment, args);}
在以上代码中 , 首先判断 addConversionService 变量是否为 true, 也就是判断是否需要添加转换服务 , 如果需要 , 则获取转换服务实例 , 并对环境设置转换服务 。 随后进行PropertySources 和 Profiles 的配置 。
其中 configurePropertySources 方法对 PropertySources 进行配置 , 代码如下 。
protected void configurePropertySources (ConfigurableEnvironment environmenString[] args) {//获得环境中的属性资源信息MutablePropertySources sources = environment . getPropertySources();// 如果默认属性配置存在则将其放置于属性资源的最后位置if (this . defaultProperties != null // 如果命令行属性存在if (this . addCommandL ineProperties //如果默认属性资源中不包含该命令 ,则将命令行属性放置在第一 位 , 如果包含 , 则通过Composite-PropertySource 进行处理if (sources . contains(name)) {PropertySource
推荐阅读
- 分析师:iPhone 12任一机型头三月销量都将超越Galaxy S21产品线
- Git服务器配置错误导致日产汽车源码在网上泄露
- 分析师预测苹果新服务可能包括播客+股票+和 邮件+
- 发布|分析师:苹果将于2021年发布AirTags物品追踪器 新款Mac也有望面世
- Google AI建立了一个能够分析烘焙食谱的机器学习模型
- 灯塔市税务局首个5G智慧办税厅开始试运行
- Axiomtek推出AIE100-903-FL-NX AI Edge系统 可在恶劣环境下运行
- 专家介绍如何判断智能手机被入侵:运行速度变慢、电池消耗过快以及卡顿
- 怎样提高苹果6的运行速度?有这些问题就别救了,你用了几年了?
- 微软推实用磁盘工具DiskSpace 帮用户分析文件占用空间