请描述一下 Spring Boot 应用从启动到就绪所经历的内部处理过程,包括关键的初始化组件和执行顺序。
考察说明
考察对 Spring Boot 自动装配和生命周期管理的理解深度。
回答思路
- 【回答框架 1】Spring Boot 启动流程始于 main 方法中 SpringApplication.run() 的调用,它会创建一个 SpringApplication 实例并执行 run 方法,整个流程可概括为准备阶段、启动阶段和就绪阶段。
- 【回答框架 2】准备阶段包括设置应用类型(如 SERVLET 或 REACTIVE)、加载所有 SpringApplicationRunListener、准备 Environment 对象并配置默认属性,同时通过 SpringFactoriesLoader 加载并实例化 ApplicationContextInitializer 和 ApplicationListener 等。
- 【回答框架 3】启动阶段会打印 Banner,创建 ApplicationContext 实例并准备上下文,包括注册 BeanDefinition、执行 BeanFactoryPostProcessor 和 BeanPostProcessor,随后刷新上下文完成 Bean 的实例化和初始化。
- 【回答框架 4】就绪阶段执行 ApplicationRunner 和 CommandLineRunner 中的回调方法,最终发布 ApplicationReadyEvent 事件,标记应用完全启动成功,可以对外提供服务。
- 【关键点 1】Spring Boot 启动核心入口是 SpringApplication.run(),流程分为准备、启动和就绪三个阶段。
- 【关键点 2】自动配置通过 @EnableAutoConfiguration 和 SpringFactoriesLoader 加载 META-INF/spring.factories 中的配置类实现。
- 【关键点 3】上下文刷新过程包括 BeanDefinition 注册、BeanPostProcessor 执行和单例 Bean 的实例化。
- 【关键点 4】启动完成后会发布 ApplicationReadyEvent,并执行 ApplicationRunner 或 CommandLineRunner 回调。
- 【易错点 1】混淆 SpringApplication.run() 的启动流程与 Spring 容器的刷新流程,前者是后者之上的封装。
- 【易错点 2】忽略 SpringApplicationRunListener 监听器机制,它是观察启动过程的关键扩展点。
- 【易错点 3】自动认为所有 Bean 都在启动时完成初始化,实际上存在懒加载配置会延迟 Bean 创建。