美文网首页
Spring Boot的启动过程二:SpringApplicat

Spring Boot的启动过程二:SpringApplicat

作者: wencai | 来源:发表于2018-01-19 20:44 被阅读0次

    参考:
    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的实例。

    相关文章

      网友评论

          本文标题:Spring Boot的启动过程二:SpringApplicat

          本文链接:https://www.haomeiwen.com/subject/ipeooxtx.html