Spring Boot的启动过程二:SpringApplicat

2018-01-19  本文已影响0人  wencai

参考:
https://www.cnblogs.com/zheting/p/6707035.htm
https://blog.hanqunfeng.com/2016/12/13/spring-boot-study-springapplication/

一、调用static方法

ctrl+单击看源码

    public static ConfigurableApplicationContext run(Object source, String... args) {
        return run(new Object[]{source}, args);
    }
    public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
        return (new SpringApplication(sources)).run(args);
    }

二、创建SpringApplication对象

SpringApplication.run()先创建一个SpringApplication对象实例,继续看构造函数

public SpringApplication(Object... sources) {
        this.bannerMode = Mode.CONSOLE;//banner的打印模式,此时是控制台模式
        this.logStartupInfo = true;//开启日志
        this.addCommandLineProperties = true;//启用CommandLineProperties
        this.headless = true;//开启headless模式支持
        this.registerShutdownHook = true;//启用注册ShutdownHook,用于在非Web应用中关闭IoC容器和资源
        this.additionalProfiles = new HashSet();
        this.initialize(sources);
    }

三、初始化

接着看初始化方法:

private void initialize(Object[] sources) {
        if (sources != null && sources.length > 0) {
            this.sources.addAll(Arrays.asList(sources));
        }
        //3.1判断是否是web运行环境,如果classpath中是否含有**WEB_ENVIRONMENT_CLASSES**指定的全部类,则返回true
        this.webEnvironment = this.deduceWebEnvironment();
        //3.2找到*META-INF/spring.factories*中声明的所有ApplicationContextInitializer的实现类并将其实例化
        this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
        //3.3找到*META-INF/spring.factories*中声明的所有ApplicationListener的实现类并将其实例化
        this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
        //3.4获得当前执行main方法的类对象,这里就是SpringBootWebDemoApplication的实例
        this.mainApplicationClass = this.deduceMainApplicationClass();
    }

3.1判断是否是web运行环境

如果classpath中含有WEB_ENVIRONMENT_CLASSES指定的全部类,则返回true,用于创建指定类型的ApplicationContext对象。

private static final String[] WEB_ENVIRONMENT_CLASSES = new String[]{"javax.servlet.Servlet", "org.springframework.web.context.ConfigurableWebApplicationContext"};

3.2加载ApplicationContextInitializer

大体的过程就是通过SpringFactoriesLoader检索org.springframework.boot:spring-boot-autoconfigure下的META-INF/spring.factories,找到声明的所有ApplicationContextInitializer的实现类并将其实例化。
ApplicationContextInitializer是Spring框架中的接口,其作用可以理解为在ApplicationContext执行refresh之前,调用ApplicationContextInitializer的initialize()方法,对ApplicationContext做进一步的设置和处理。

public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {
    void initialize(C var1);
}

springboot1.5.9.RELEASE版本中的META/spring.factories包含的ApplicationContextInitializer:

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer

3.3加载ApplicationListener

大体的过程就是通过SpringFactoriesLoader检索META-INF/spring.factories,找到声明的所有ApplicationListener的实现类并将其实例化。
ApplicationListener是Spring框架中的接口,就是事件监听器,其作用可以理解为在SpringApplicationRunListener发布通知事件时,由ApplicationListener负责接收。

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    void onApplicationEvent(E var1);
}

SpringBoot只提供了一个SpringApplicationRunListener的实现类,就是EventPublishingRunListener,其作用是在SpringBoot启动过程中,负责注册ApplicationListener监听器,在不同时间点发布不同的事件类型,如果有哪些ApplicationListener的实现类监听了这些事件,则可以接受并处理。

public interface SpringApplicationRunListener {
    //通知监听器,SpringBoot开始执行
    void starting();
    //通知监听器,Environment准备完成
    void environmentPrepared(ConfigurableEnvironment var1);
    //通知监听器,ApplicationContext已经创建并初始化完成
    void contextPrepared(ConfigurableApplicationContext var1);
    //通知监听器,ApplicationContext已经完成IoC配置加载
    void contextLoaded(ConfigurableApplicationContext var1);
    //通知监听器,SpringBoot启动完成
    void finished(ConfigurableApplicationContext var1, Throwable var2);
}

spring-boot-autoconfigure-1.5.9.RELEASE.jar中的META-INF/spring.factories包含的ApplicationListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

spring-boot-1.5.9.RELEASE.jar中的META-INF/spring.factories包含的ApplicationListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.ClearCachesApplicationListener,\
org.springframework.boot.builder.ParentContextCloserApplicationListener,\
org.springframework.boot.context.FileEncodingApplicationListener,\
org.springframework.boot.context.config.AnsiOutputApplicationListener,\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
org.springframework.boot.context.config.DelegatingApplicationListener,\
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener,\
org.springframework.boot.logging.ClasspathLoggingApplicationListener,\
org.springframework.boot.logging.LoggingApplicationListener

3.4设置main方法定义类

获得当前只需main方法的类对象,这里就是XXXApplication的实例。

上一篇下一篇

猜你喜欢

热点阅读