Spring Boot的启动
Spring Boot的启动过程可以清晰地划分为几个主要阶段,以下是按照关键步骤进行的详细阐述:
一、启动准备阶段
-
加载启动类:
- 当SpringBoot项目启动时,它会在当前工作目录下寻找带有
@SpringBootApplication
注解标识的类,并把这个类作为应用程序的入口点。 - 如果找不到这样的主类,则会打印错误信息并退出。
- 当SpringBoot项目启动时,它会在当前工作目录下寻找带有
-
创建StopWatch实例:
- 用于记录SpringBoot的启动时间。
-
加载监听器:
- 使用
SpringFactoriesLoader
加载监听器,如EventPublishingRunListener
。
- 使用
二、配置加载阶段
-
加载配置文件:
- SpringBoot会自动扫描当前项目的
resources
目录,并加载其中的application.properties
或application.yml
等配置文件。 - 这些配置文件中包含了应用程序的各种参数,例如数据库连接信息、日志级别等。
- SpringBoot会自动扫描当前项目的
-
配置环境:
- 创建和配置
Environment
,该对象包含了应用程序的运行环境信息。
- 创建和配置
三、初始化ApplicationContext
-
创建ApplicationContext:
- 根据项目类型(Web、Reactive、非Web)创建相应的
ApplicationContext
实例。
- 根据项目类型(Web、Reactive、非Web)创建相应的
-
加载Bean:
- 扫描当前项目中的所有Bean,并将它们注册到
ApplicationContext
中。 - 加载自动配置,根据starter依赖中的
Configuration
和Bean的装配情况,自动装配相应的Bean。
- 扫描当前项目中的所有Bean,并将它们注册到
四、启动内嵌的Web服务器
- 如果项目是一个Web应用,SpringBoot会根据配置文件中的信息自动创建Tomcat或Jetty等Web容器,并将Spring容器注册到Web容器中,使得SpringBoot应用程序可以直接以Web应用程序的形式运行。
五、启动应用程序
- 根据之前创建好的Spring容器以及Web服务器,启动相应的线程进行服务处理。
六、监听应用程序的状态
- SpringBoot会监听应用程序的状态,并根据需要进行相应的操作。
- 例如,当应用程序退出时,它会打印出详细的日志信息,并将应用程序的上下文环境恢复到初始状态。
七、发布事件
- 在启动的不同阶段,SpringBoot会发布各种事件,如
started()
、ready()
等,允许开发者在特定的时间点执行自定义的逻辑。
八、停止计时并打印日志
- StopWatch停止计时,并打印出整个启动过程所花费的时间。
整个启动过程体现了Spring Boot的自动化和简洁性,开发者只需关注业务逻辑的实现,而无需过多关注底层的启动细节。