本节将对EnvironmentPostProcessorApplicationListener进行分析,该对象属于应用监听器(ApplicationListener)的实现类,下面对EnvironmentPostProcessorApplicationListener成员变量进行说明,详细内容见表5-5。
表5-5 EnvironmentPostProcessorApplicationListener成员变量
对象EnvironmentPostProcessorApplicationListener是应用监听器接口的实现类,它能够处理不同的应用事件,在该对象中只允许处理以下三个事件:
(1)ApplicationEnvironmentPreparedEvent表示应用程序环境准备事件;
(2)ApplicationPreparedEvent表示应用程序准备事件;
(3)ApplicationFailedEvent表示应用程序失败事件。
关于上述三个事件的处理代码如下:
public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ApplicationEnvironmentPreparedEvent) { // 应用程序环境准备事件 onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event); } if (event instanceof ApplicationPreparedEvent) { // 应用程序准备事件 onApplicationPreparedEvent((ApplicationPreparedEvent) event); } if (event instanceof ApplicationFailedEvent) { // 应用程序失败事件 onApplicationFailedEvent((ApplicationFailedEvent) event); } }
在onApplicationEvent方法中会根据事件类型做出不同的处理,其中onApplication-PreparedEvent方法和onApplicationFailedEvent方法的底层调度都是finish方法,finish方法的详细代码如下:
private void fi nish() { // 输出日志 this.deferredLogs.switchOverAll(); }
对于finish方法可以简单理解为日志的输出,这里会输出到指定的目的地。下面对onApplicationEnvironmentPreparedEvent方法进行分析,具体处理代码如下:
private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) { // 从事件中获取环境配置对象 ConfigurableEnvironment environment = event.getEnvironment(); // 获取spring应用对象 SpringApplication application = event.getSpringApplication(); // 获取环境后置处理器 for (EnvironmentPostProcessor postProcessor : getEnvironmentPostProcessors(event.getBootstrapContext())) { // 后置处理器进行处理 postProcessor.postProcessEnvironment(environment, application); } }
在onApplicationEnvironmentPreparedEvent方法中主要的处理流程如下:
(1)从事件对象中获取环境配置对象;
(2)获取Spring应用对象;
(3)获取环境后置处理器集合,调用每个后置处理器的postProcessEnvironment方法。
在上述处理流程中关键点是获取环境后置处理器,具体处理代码如下:
List<EnvironmentPostProcessor> getEnvironmentPostProcessors(ConfigurableBootstrap Context bootstrapContext) { return this.postProcessorsFactory.getEnvironmentPostProcessors(this. deferredLogs, bootstrapContext); } public List<EnvironmentPostProcessor> getEnvironmentPostProcessors(DeferredLogFactory logFactory, ConfigurableBootstrapContext bootstrapContext) { Instantiator<EnvironmentPostProcessor> instantiator = new Instantiator<>(EnvironmentPostProcessor.class, (parameters) ->{ parameters.add(DeferredLogFactory.class, logFactory); parameters.add(Log.class, logFactory::getLog); parameters.add(ConfigurableBootstrapContext.class, bootstrap Context); parameters.add(BootstrapContext.class, bootstrapContext); parameters.add(BootstrapRegistry.class, bootstrapContext); }); return instantiator.instantiate(this.classNames); }
在getEnvironmentPostProcessors方法中会通过Instantiator对象将classNames中的Environment-PostProcessor数据进行实例化。其中,关于classNames的数据来源需要通过下面代码来进行初始化:
public interface EnvironmentPostProcessorsFactory { static EnvironmentPostProcessorsFactory fromSpringFactories(ClassLoader classLoader){ return new Re fl ectionEnvironmentPostProcessorsFactory( SpringFactoriesLoader.loadFactoryNames(EnvironmentPostProcessor.class, classLoader)); } }
这段代码会在spring.factories文件中寻找org.springframework.boot.env.EnvironmentPost-Processor键的数据,详细数据如下:
org.springframework.boot.env.EnvironmentPostProcessor=\ org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\ org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor,\ org.springframework.boot.env.RandomValuePropertySourceEnvironmentPostProcessor,\ org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,\ org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor,\ org.springframework.boot.reactor.DebugAgentEnvironmentPostProcessor
经过getEnvironmentPostProcessors方法就可以将上述环境后置处理器从类转换成Java对象,getEnvironmentPostProcessors执行结果如图5-3所示。
图5-3 getEnvironmentPostProcessors执行结果