1. 主入口与 SpringApplication.run()
- 入口方法
一般在应用的主类中有public static void main(String[] args)
方法,该方法调用了SpringApplication.run(Application.class, args)
。 - SpringApplication 对象的创建
通过run()
方法,Spring Boot 创建了一个SpringApplication
实例,这个实例负责整个启动流程的协调工作。
2. 准备阶段
- Environment 准备
在正式创建 Spring 应用上下文之前,Spring Boot 会先准备好环境(Environment),包括加载配置文件(如 application.properties 或 application.yml)、系统环境变量、命令行参数等信息,并解析成Environment
对象。 - Banner 展示
在环境准备过程中,Spring Boot 会加载并打印启动 Banner。Banner 可以是默认的,也可以自定义。 - 初始器(Initializers)和监听器(Listeners)注册
根据配置,Spring Boot 会注册各类初始器和事件监听器,这些组件会在后续的启动过程中接收各类启动事件(如 ApplicationStartingEvent、ApplicationPreparedEvent、ApplicationReadyEvent 等)。
3. 创建应用上下文(ApplicationContext)
- 选择容器类型
Spring Boot 根据项目依赖和配置选择合适的 ApplicationContext 实现。例如,对于 Web 应用,会使用AnnotationConfigServletWebServerApplicationContext
,而对于非 Web 应用则使用AnnotationConfigApplicationContext
。 - 实例化上下文
调用createApplicationContext()
方法创建对应的上下文实例。
4. Bean 定义加载与上下文刷新
- 加载 Bean 定义
Spring Boot 通过扫描(Component Scan)、配置类(@Configuration)等方式加载所有需要注册的 Bean 定义。 - 上下文刷新(refresh())
在调用refresh()
方法时,Spring 会完成:- BeanFactory 的初始化
注册所有的 Bean 定义、处理依赖注入、应用 AOP 等; - BeanPostProcessor 的应用
在 Bean 实例化前后进行各种处理,如注解解析、事务增强等; - 事件发布
在关键时刻触发相应的启动事件通知注册的监听器。
- BeanFactory 的初始化
5. Embedded Web Server 的启动(针对 Web 应用)
- 启动嵌入式服务器
对于 Spring Boot Web 应用,会自动配置并启动嵌入式的 Web 服务器(如 Tomcat、Jetty 或 Undertow)。在上下文刷新过程中,会创建服务器工厂并启动服务器。 - DispatcherServlet 初始化
随后会初始化并注册DispatcherServlet
,负责接收并分发 HTTP 请求。
6. ApplicationRunner 和 CommandLineRunner 执行
- 运行自定义逻辑
当所有 Bean 都已初始化完毕,并且上下文已经刷新后,Spring Boot 会查找并执行所有实现了ApplicationRunner
或CommandLineRunner
接口的 Bean,这些组件可以在应用启动完成后执行特定的业务逻辑。
7. 应用启动完成
- 发布 ApplicationReadyEvent
当所有启动步骤都完成后,Spring Boot 会发布一个ApplicationReadyEvent
事件,表明应用已经完全启动并且可以开始接收请求。 - 等待请求
对于 Web 应用来说,嵌入式服务器此时已经在监听端口等待 HTTP 请求;对于其他类型应用,则进入运行状态等待任务执行或事件触发。
总结
整个启动过程可以概括为:
- 入口调用与环境准备:main 方法 -> SpringApplication.run() -> 加载配置与初始化环境
- 上下文创建与 Bean 加载:实例化 ApplicationContext -> 加载并注册 Bean 定义 -> 刷新上下文
- 嵌入式服务器启动(Web 应用):启动并配置内置 Web 服务器
- 启动后逻辑执行:执行 ApplicationRunner/CommandLineRunner -> 应用完全启动并准备就绪
Spring Boot 的启动流程可以概括为以下几个主要步骤:
- 启动入口: 程序从
main
方法开始执行,通常调用SpringApplication.run(Application.class, args)
,这一步骤负责启动整个 SpringBoot 应用。- 环境准备与Banner打印: 在运行
SpringApplication.run()
时,会初始化SpringApplication
对象。这个过程中会准备好Environment
(包括读取配置文件、命令行参数等),同时还会打印出启动 Banner。- ApplicationContext 的创建: 根据应用类型(比如 Web 应用或非 Web 应用),Spring Boot 会自动选择合适的
ApplicationContext
实现(例如AnnotationConfigServletWebServerApplicationContext
或AnnotationConfigApplicationContext
),并进行实例化。- BeanDefinition 的加载与注册: Spring Boot 会扫描和加载所有的配置类以及自动装配的组件。这里包括对用户自定义配置类和自动配置类的处理,进而注册所有的 Bean 定义到容器中。
- ApplicationContext 的刷新: 调用
refresh()
方法,完成对容器的初始化,这一过程中会实例化所有单例 Bean,并触发 Bean 的生命周期回调,如@PostConstruct
、InitializingBean
的afterPropertiesSet()
等。- 监听器与Runner的执行: Spring Boot 启动过程中会触发各种事件(如
ApplicationStartedEvent
、ApplicationReadyEvent
),同时执行实现了CommandLineRunner
或ApplicationRunner
接口的组件,用于在应用启动完成后执行特定逻辑。- 启动完成: 至此,Spring Boot 应用完成启动,等待接收请求或执行相应的业务逻辑。
评论留言
欢迎您,!您可以在这里畅言您的的观点与见解!
0 条评论