• Spring Boot 启动过程


    一切从SpringApplication.run()开始,最终返回一个ConfigurableApplicationContext

    构造了一个SpringApplication对象,然后调用它的run方法。下面看下构造方法都做了什么

    1、推断Web应用类型(WebApplicationType),本例中是SERVLET

    2、设置 Bootstrapper、ApplicationContextInitializer 和 ApplicationListener

    3、推断main方法 

    注意到,在设置 Bootstrapper、ApplicationContextInitializer 和 ApplicationListener 时,都调用了同一个方法getSpringFactoriesInstances

    从所有 META-INF/spring.factories 文件中加载,并查找指定名称的的值

    回到之前的构造方法那里,现在我们知道设置的Bootstrapper、ApplicationContextInitializer、ApplicationListener是从哪儿来的了,原来是在META-INF/spring.factories中配置的。查找指定key对应的值,然后实例化它们,并返回一个List

    接下来,重头戏,调用run方法

    重点看try里面的内容

    首先是启动监听器来监听启动过程,这里再一次调用了熟悉的getSpringFactoriesInstances

    然后,将main方法中传的参数包装成ApplicationArguments对象

    紧接着,创建并配置环境,返回一个ConfigurableEnvironment对象,由于本例中是SERVLET,所以创建的是StandardServletEnvironment

    然后,打印Banner

    创建ApplicationContext,所有基于Spring的项目启动过程都是创建ApplicationContext

    这里创建的ConfigurableApplicationContext是AnnotationConfigServletWebServerApplicationContext

    有了ApplicationContext,紧接着要配置ApplicationContext

    加载所有的source(其实就是class),然后实例化

    这里就是一个,就是启动类

    接下来,刷新容器

    最终是调用Spring的applicationContext.refresh(),又看到了熟悉的一幕

    最后还留了一个入口,回调子容器的onRefresh()

    Spring MVC的启动是创建父子两个WebApplicationContext 

    在刷新容器之后,所有的Bean都已经实例化完成

    afterRefresh什么也没做

    最后是回调Runner,回调所有的ApplicationRunner和CommandLineRunner

    至此,Spring Boot启动完成

    回顾一下,

    1、推断Web应用类型

    2、设置Bootstrapper、ApplicationContextInitializer、ApplicationListener

    3、推断main方法

    4、创建并配置环境Environment

    5、打印Banner

    6、创建并配置ApplicationContext

    7、刷新ApplicationContext(此处交由Spring处理,调用Spring的refresh()方法)实例化所有的bean

    8、回调所有的ApplicationRunner和CommandLineRunner

  • 相关阅读:
    博客园如何统计个人博客的访问量
    博客园博客如何设置不显示日历,公告,相册,收藏夹等
    [Functional Programming] From simple implementation to Currying to Partial Application
    [Nginx] Configuration for SPA
    [Unit Testing] Using Mockito Annotations
    [Functional Programming] Using Lens to update nested object
    [Functional Programming + React] Provide a reasonable default value for mapStateToProps in case initial state is undefined
    [Angular CLI] Build application without remove dist folder for Docker Volume
    [Spring Boot] Introduce to Mockito
    [Tool] Enable Prettier in VSCode as Format on Save and add config files to gitingore
  • 原文地址:https://www.cnblogs.com/cjsblog/p/14528923.html
Copyright © 2020-2023  润新知