SpringBoot 启动流程简介

258 阅读2分钟

SpringBoot的启动

@SpringBootApplication  
public class SpringbootLectureApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(SpringbootLectureApplication.class, args);  
    }  
}

在调用run()方法前

  • 调用run()方法前,需要先实例化 SpringApplication image.png
  • 会创建SpringFactoriesInstances
    • 就是实例化一些必须组件以及可能用的到的组件,也就是自动配置。
    • 主要是通过spring.factories文件定位。该文件有列出需要实例化的组件。 image.png image.png
  • 其中实例化相关组件时涉及到一个重要类,SpringFactoriesLoader。
    • 它是从“META-INF/spring.factories”文件加载并实例化给定类型的工厂,这些文件可能存在于类路径中的多个 JAR 文件中。 spring.factories 文件必须采用 Properties 格式,其中key是接口或抽象类的完全限定名称,value是逗号分隔的实现类名称列表(list)。
    • 实例化就少不了类加载,这里Spring 显式获取类记载器,是因为这些组件暂时没有被使用,所以不会被jvm自带的三个类加载器加载。但是 spring.factories提供了类的全限定名,那么类加载器就可以直接加载它们,而不是等到使用时再去加载它们。 image.png

调用run()方法

  • 实例化SpringApplication后就是调用run()方法了。
  • 大致了解其流程。
  • 该方法的返回类型是ConfigurableApplicationContext,即ApplicationContext的子类,ApplicationContext是Spring应用的核心接口
  • 创建一个 DefaultBootstrapContext 实例,用于在应用程序启动早期阶段共享和存储特定信息。
    • ApplicationContext在创建之前,可能需要一些必要的Bean。需要先于Context创建。
  • 向对ApplicationContext在创建之前感兴趣的监听器发送广播。
  • 处理Environment,就是处理 profiles 和 properties。
  • 打印Banner。
  • 创建一个ApplicationContext空壳子。
    • 没有refresh()
  • ApplicationContext准备环境(Environment)、配置以及加载必要的组件。
    • 注册必要的配置类,就是解析配置,将其变成BeanDefinition。
  • refresh(),注册和实例化Bean。启动web服务器,如tomcat(如果内嵌)。
  • 之后就就是一些收尾工作了,比如事件通知,清除一些用于初始化的元数据,因为数据都变成Bean了(单例)。

image.png

小结

  • Spring Boot 的设计理念是简化配置和快速启动,而传统 Spring 则需要更多手动配置和设置。Spring Boot 通过自动配置、内嵌服务器和starter依赖等功能,让开发者可以更快地启动和部署应用程序,而传统 Spring 提供了更细粒度的控制和配置选项,但可能需要更多的设置工作。