购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.10 EnvironmentPostProcessorApplicationListener分析

本节将对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执行结果 T4uvcJM+v8CeCMJaLj05x9NjATzPuNyJRZ6RZoOYQoelSxs8zPPOY/9SAdnjwiPX

点击中间区域
呼出菜单
上一章
目录
下一章
×