spring-boot-EnvironmentPostProcessor

 

原理:

1-从启动类入口的run方法进入:
    public ConfigurableApplicationContext run(String... args) {
        -SpringApplicationRunListeners listeners = getRunListeners(args);
        -ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);

 

 

 

监听器:EventPublishingRunListener

 

 

2-prepareEnvironment方法:

private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,
        ApplicationArguments applicationArguments) {
    // Create and configure the environment
    ConfigurableEnvironment environment = getOrCreateEnvironment();//用于创建一个存储变量信息的environment
    configureEnvironment(environment, applicationArguments.getSourceArgs());
    ConfigurationPropertySources.attach(environment);
    listeners.environmentPrepared(environment);
    bindToSpringApplication(environment);
    if (!this.isCustomEnvironment) {
        environment = new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,
                deduceEnvironmentClass());
    }
    ConfigurationPropertySources.attach(environment);
    return environment;
    }


3-configureEnvironment(environment, applicationArguments.getSourceArgs());加载基本的配置
        protected void configureEnvironment(ConfigurableEnvironment environment, String[] args) {
        if (this.addConversionService) {
            ConversionService conversionService = ApplicationConversionService.getSharedInstance();
            environment.setConversionService((ConfigurableConversionService) conversionService);
        }
        configurePropertySources(environment, args);
        configureProfiles(environment, args);
    }

加载的配置文件包括下面:

 

 

 

4-prepareEnvironment-中调用listeners.environmentPrepared(environment);
这个监听器就是我们上面的EventPublishingRunListener
继续跟进进出会在EventPublishingRunListner中找到:

@Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        this.initialMulticaster
                .multicastEvent(new ApplicationEnvironmentPreparedEvent(this.application, this.args, environment));
    }//新建事件ApplicationEnvironmentPreparedEvent,

 

5-寻=寻找监听ApplicationEnvironmentPreparedEvent事件的监听器:ConfigFileApplicationListener
里面有两个个方法

@Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ApplicationEnvironmentPreparedEvent) {
            onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);
        }
        if (event instanceof ApplicationPreparedEvent) {
            onApplicationPreparedEvent(event);
        }
    }

    private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {
        List<EnvironmentPostProcessor> postProcessors = loadPostProcessors();
        postProcessors.add(this);
        AnnotationAwareOrderComparator.sort(postProcessors);
        for (EnvironmentPostProcessor postProcessor : postProcessors) {
            postProcessor.postProcessEnvironment(event.getEnvironment(), event.getSpringApplication());
        }
    }

 

for (EnvironmentPostProcessor postProcessor : postProcessors) {
        //对所有实现EnvironmentPostProcessor接口的实现类执行内部方法.postProcessEnvironment
            postProcessor.postProcessEnvironment(event.getEnvironment(), event.getSpringApplication());
        }

 

6-官方必须从META-INF/spring.factories:6

在List<EnvironmentPostProcessor> postProcessors = loadPostProcessors();中
    List<EnvironmentPostProcessor> loadPostProcessors() {
        return SpringFactoriesLoader.loadFactories(EnvironmentPostProcessor.class, getClass().getClassLoader());
    }

    SpringFactoriesLoader的一个静态函数:loadFactories

 

posted @ 2020-09-28 10:32  小丑quan  阅读(492)  评论(0)    收藏  举报