在前文对EnvironmentPostProcessorApplicationListener进行分析时发现,在处理应用程序环境准备事件(ApplicationEnvironmentPreparedEvent)时需要使用环境后置处理器来进行处理,在前文已经知道Spring Boot中的默认6个环境后置处理器分别是:
(1)CloudFoundryVcapEnvironmentPostProcessor;
(2)ConfigDataEnvironmentPostProcessor;
(3)RandomValuePropertySourceEnvironmentPostProcessor;
(4)SpringApplicationJsonEnvironmentPostProcessor;
(5)SystemEnvironmentPropertySourceEnvironmentPostProcessor;
(6)DebugAgentEnvironmentPostProcessor。
在整个Spring Boot中关于EnvironmentPostProcessor的实现类共有12个,Environment-PostProcessor实现类如图5-4所示。
图5-4 EnvironmentPostProcessor实现类
本节将对CloudFoundryVcapEnvironmentPostProcessor进行分析,该对象主要处理VCAP(Cloud Foundry)相关的数据。在该对象中主要关注的方法是postProcessEnvironment,具体处理代码如下:
上述代码的主要处理流程如下:
(1)创建属性存储对象,从json解析器工厂中获取json解析器;
(2)获取VCAP_APPLICATION对应的数据,将解析结果加入属性表中,属性表的前缀是vcap.application;
(3)获取VCAP_SERVICES对应的数据,将解析结果加入属性表中,属性表的前缀是vcap.services;
(4)从环境对象中获取属性源对象;
(5)判断属性源对象中是否包含commandLineArgs相关的键值数据,如果存在将数据放入最后,如果不存在则放入第一个。
在第(2)步和第(3)步中数据获取是从环境配置对象中获取,并且设置默认值为"{}"。如果需要使用该对象的技术涉及spring-cloud-cloudfoundry-connector和spring-cloud-springservice-connector的依赖,本节不对技术使用进行说明。
本节将对ConfigDataEnvironmentPostProcessor进行分析,对于该对象主要分析postProcess-Environment方法,详细处理代码如下:
在上述代码中主要的处理流程如下:
(1)获取资源加载器;
(2)获取ConfigDataEnvironment并处理应用。
在上述处理流程中主要关注ConfigDataEnvironment的创建过程,关于该对象的其他内容将在下一节进行分析,详细创建代码如下:
ConfigDataEnvironment getConfigDataEnvironment(ConfigurableEnvironment environment, ResourceLoader resourceLoader, Collection<String> additionalProfiles) { return new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, environment, resourceLoader, additionalProfiles, this.environmentUpdateListener); }
如果在上述处理中出现异常会进行如下处理:
(1)配置profile相关内容;
(2)后处理。
关于第(1)步操作配置profile相关内容,其本质是将方法参数additionalProfiles加入环境变量的激活profile属性中。关于后处理具体处理代码如下:
private void postProcessUsingLegacyApplicationListener(ConfigurableEnvironment environment, ResourceLoader resourceLoader) { getLegacyListener().addPropertySources(environment, resourceLoader); }
在这段代码中创建了LegacyConfigFileApplicationListener并添加了属性。