美文网首页
6、springboot启动过程

6、springboot启动过程

作者: lois想当大佬 | 来源:发表于2020-04-25 11:37 被阅读0次

    springboot的启动方式有2种:一种是打包jar包,java -jar启动,一种是直接运行应用的 Spring Boot 启动类的 #main(String[] args) 启动。我们这里分析的是启动类方式的启动过程。
    1、从main开始


    image.png

    2、进入springApplication的静态run方法


    image.png

    以上方法创建了springApplication对象,并调用对象的run方法。

    3、看看创建对象的时候做了什么


    image.png
    image.png

    总结创建对象做了哪些事:
    a、把你项目的启动类添加到SpringApplication中
    b、读取springApplication当前路径下META-INF/spring.factories文件,加载ApplicationContextInitializer接口实例,加载ApplicationListener接口实例。

    创建对象完毕,回到上层方法:


    image.png

    4、接下来调用SpringApplication对象的run方法,重点!!!

    public ConfigurableApplicationContext run(String... args) {
            // 非重点
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            ConfigurableApplicationContext context = null;
            Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
            this.configureHeadlessProperty();
            SpringApplicationRunListeners listeners = this.getRunListeners(args);
            listeners.starting();
    
            Collection exceptionReporters;
            try {
                ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
                // 创建环境,加载我们项目resource目录下的配置文件,最后把environment和springApplication进行绑定
                ConfigurableEnvironment environment = this.prepareEnvironment(listeners, applicationArguments);
                // 设置一些环境的值
                this.configureIgnoreBeanInfo(environment);
                // 打印banner
                Banner printedBanner = this.printBanner(environment);
                // 根据项目类型创建应用上下文,并加入一些核心组件
                context = this.createApplicationContext();
                // 获取异常报告事件监听
                exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
                // 准备上下,设置环境信息
                this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);
              // spring初始化过程,创建并启动了内置的Tomcat容器
                this.refreshContext(context);
                // 空方法
                this.afterRefresh(context, applicationArguments);
                stopWatch.stop();
                if (this.logStartupInfo) {
                    (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
                }
    
                listeners.started(context);
                this.callRunners(context, applicationArguments);
            } catch (Throwable var10) {
                this.handleRunFailure(context, var10, exceptionReporters, listeners);
                throw new IllegalStateException(var10);
            }
    
            try {
                listeners.running(context);
                return context;
            } catch (Throwable var9) {
                this.handleRunFailure(context, var9, exceptionReporters, (SpringApplicationRunListeners)null);
                throw new IllegalStateException(var9);
            }
        }
    

    4.1、看this.prepareEnvironment()方法

    创建环境并配置环境信息,在listeners.environmentPrepared()方法中加载了我们resource目录下的配置文件。


    image.png
    image.png

    把environment和springApplication绑定


    image.png

    总结this.prepareEnvironment()方法作用:
    1、创建环境,加载我们项目resource目录下的配置文件,最后把environment和springApplication进行绑定。

    4.2、进入this.createApplicationContext()方法
    根据项目类型创建应用上下文


    image.png

    Web类型项目创建上下文对象是AnnotationConfigServletWebServerApplicationContext,并加入一些核心组件


    image.png

    总结this.createApplicationContext()方法作用:
    1、根据项目类型创建应用上下文,并加入一些核心组件。

    4.3、进入this.prepareContext()方法


    image.png

    总结this.prepareContext()方法作用:
    1、把环境信息添加到上下文中
    2、设置事件监听
    3、bean工厂添加相关单例类

    4.4、进入this.refreshContext(context)方法


    image.png

    等等,是不是感到莫名的熟悉!!!这是spring的初始化过程方法呀,之前我们已经分析过spring初始化过程,
    请移步:https://www.jianshu.com/p/50b716c4cdb6

    4.4.1、这里补充一个spring初始化过程没有实现的方法this.onRefresh(),进入到AbstractApplicationContext子类ServletWebServerApplicationContext,看看对onRefresh()方法的实现


    image.png image.png

    选择创建哪种类型的web容器


    image.png
    image.png
    image.png

    总结this.onRefresh()方法的作用:
    1、创建并启动内置的Tomcat容器。

    至此,springboot启动过程已完成


    image.png

    总结下这个过程重点方法:
    1、SpringApplication -> new SpringApplication()
    2、SpringApplication -> this.prepareEnvironment()
    3、SpringApplication ->this.createApplicationContext()
    4、SpringApplication -> this.prepareContext()
    5、SpringApplication -> this.refreshContext()
    6、AbstractApplicationContext -> this.onRefresh()

    总结下以上方法主要作用:
    1、创建springApplication对象,把你项目的启动类添加到SpringApplication中,读取springApplication当前路径下META-INF/spring.factories文件,加载ApplicationContextInitializer接口实例,加载ApplicationListener接口实例。
    2、创建环境,加载我们项目resource目录下的配置文件,最后把environment和springApplication进行绑定。
    3、根据项目类型创建应用上下文,并加入一些核心组件。
    4、把环境信息添加到上下文中,设置事件监听,bean工厂添加相关单例类。
    5、spring 容器初始化过程
    6、创建并启动内置的Tomcat容器。

    相关文章

      网友评论

          本文标题:6、springboot启动过程

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