本节将对ContextIdApplicationContextInitializer进行分析,关于该对象的基础定义代码如下:
public class ContextIdApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>, Ordered {}
从对象的基础定义中可以发现并未实现其他接口,下面对ApplicationContextInitializer的实现方法进行说明,详细代码如下:
public void initialize(ConfigurableApplicationContext applicationContext) { // 获取上下文ID ContextId contextId = getContextId(applicationContext); // 设置应用上下文ID applicationContext.setId(contextId.getId()); // 注册上下文ID applicationContext.getBeanFactory().registerSingleton(ContextId.class. getName(), contextId); }
在initialize方法中主要的处理流程如下:
(1)获取上下文ID;
(2)为应用上下文设置上下文ID;
(3)向Bean工厂中注册上下文ID。
下面将对ConfigDataApplicationContextInitializer进行分析,关于该对象的基础定义代码如下:
public class ConfigDataApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {}
从对象的基础定义中可以发现并未实现其他接口,下面对ApplicationContextInitializer的实现方法进行说明,详细代码如下:
public void initialize(ConfigurableApplicationContext applicationContext) { // 获取环境对象 ConfigurableEnvironment environment = applicationContext.getEnvironment(); // 添加环境对象 RandomValuePropertySource.addToEnvironment(environment); // 创建默认的引导上下文 DefaultBootstrapContext bootstrapContext = new DefaultBootstrapContext(); // 应用配置 ConfigDataEnvironmentPostProcessor.applyTo(environment, applicationContext, bootstrapContext); // 关闭引导上下文 bootstrapContext.close(applicationContext); // 移动到最后 DefaultPropertiesPropertySource.moveToEnd(environment); }
在initialize方法中主要的处理流程如下:
(1)获取环境对象;
(2)添加环境对象;
(3)创建默认的引导上下文;
(4)应用环境配置;
(5)关闭引导上下文,触发BootstrapContextClosedEvent事件;
(6)将环境对象移动到最后索引位。
在上述处理流程中最关键的方法是ConfigDataEnvironmentPostProcessor.applyTo,详细代码如下:
在上述代码中主要目标是创建ConfigDataEnvironmentPostProcessor来完成后置的环境对象处理,具体处理代码如下:
在postProcessEnvironment方法中主要目标是创建ConfigDataEnvironment并且调用processAnd-Apply方法,processAndApply的详细代码如下:
在上述代码中会创建ConfigDataImporter、ConfigDataEnvironmentContributors和ConfigData-ActivationContext,这三个对象属于环境配置信息存储对象,最终它们三个对象都会进行profile的应用,当应用完成后会进行环境对象的应用,具体处理方法是applyToEnvironment,详细代码如下:
在applyToEnvironment方法中主要的处理流程如下。
(1)检查contributors对象中的无效数据,检查过程中会抛出异常。
(2)从环境对象中获取属性源对象。
(3)处理contributors中的各个元素,处理细节是将合法元素加入第(2)步获取的属性源对象中,并且触发onPropertySourceAdded方法,onPropertySourceAdded方法是环境配置(属性)变化后的一个事件。
(4)移动属性源对象到最后一个元素位置。
(5)获取profiles,将其设置到环境变量中。