SpringBoot的启动流程是一个复杂但有序的过程,它涉及多个步骤和组件的协同工作。以下是SpringBoot启动流程的详细解析:
一、启动main方法
当SpringBoot项目启动时,它会在当前工作目录下寻找有@SpringBootApplication
注解标识的类,并把这个类作为应用程序的入口点。在这个启动类中,会包含一个main()
方法,用于启动整个应用程序。在main()
方法中,会创建一个SpringApplication
对象,并调用其run()
方法来启动应用程序。
二、SpringApplication准备阶段
在SpringApplication
对象创建并调用run()
方法之前,会进行一些准备工作:
- 读取配置文件 :通过类加载器读取
classpath
下所有的spring.factories
配置文件,创建一些初始配置对象。这些配置对象包括应用程序的初始化器(ApplicationContextInitializer
)和监听器(ApplicationListener
)。 - 设置主类 :通过
deduceMainApplicationClass()
方法推断出主方法所在的类,为后续的包扫描和Bean注册做准备。 - 开启计时器:记录应用程序的启动时间,以便在启动完成后打印出启动时长。
三、创建应用程序上下文
接下来,SpringApplication
会创建应用程序的上下文(ApplicationContext
),这是Spring框架的核心容器,用于管理Bean的生命周期和依赖注入。在创建上下文的过程中,会进行以下操作:
- 准备环境 :创建并配置
ConfigurableEnvironment
对象,用于读取环境配置,如application.yml
或application.properties
文件。 - 创建上下文 :根据应用类型(如Servlet应用)创建合适的
ApplicationContext
实现类,如AnnotationConfigServletWebServerApplicationContext
。
四、刷新上下文(启动核心)
刷新上下文是SpringBoot启动流程中的核心步骤,它涉及多个子步骤,包括:
- 配置工厂对象 :配置上下文类加载器、对象发布处理器和
BeanFactoryPostProcessor
等。 - 注册并实例化Bean :注册并实例化所有自动配置的Bean,以及通过包扫描找到的Bean。同时,会调用
BeanPostProcessor
对Bean进行后处理。 - 初始化特殊Bean:初始化一些与上下文有特别关系的Bean对象,如创建Tomcat服务器(对于Web应用)。
- 实例化剩余Bean:实例化所有剩余的Bean对象,并缓存到Bean工厂中。
- 发布通知:通知上下文刷新完成,并启动Tomcat服务器(对于Web应用)。
五、通知监听者并启动程序
在上下文刷新完成后,SpringApplication
会通知所有的监听者(ApplicationListener
),并调用它们的started()
方法。同时,会执行所有实现了CommandLineRunner
和ApplicationRunner
接口的Bean,以便在应用启动后执行一些特定的代码。
六、应用启动完成
一旦所有的步骤都完成,SpringBoot应用就会处于运行状态,准备好接受请求。此时,计时器会停止,并打印出启动时长。
综上所述,SpringBoot的启动流程是一个涉及多个步骤和组件的复杂过程,但它通过有序地执行这些步骤来确保应用程序能够正确地启动和运行。