SpringBoot 启动过程
Spring Boot 是构建在 Spring 框架之上的项目,它通过简化配置和内置的开发工具,帮助开发者快速创建基于 Spring 的应用。Spring Boot 的主要目的是减少样板代码和配置,使得开发者能够专注于业务逻辑。
它的主要启动逻辑都源自于它的主启动类注解上:@SpringBootApplication,其中包含了三个注解来实现以下功能:
@Configuration 注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。
@ComponentScan 的功能其实就是自动扫描并加载符合条件的组件,最终将这些bean定义加载到IoC容器中。
@EnableAutoConfiguration 将所有符合自动配置条件的bean定义加载到IoC容器,自动配置好tomcat、springmvc、web常见功能,初始化容器、应用监听器。
Spring Boot 的启动过程主要围绕 SpringApplication.run() 展开,其核心是 SpringApplication 初始化、环境准备、ApplicationContext 创建、Bean 加载与依赖注入、事件监听 等。
Spring Boot 启动的完整流程
public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);
}
核心步骤如下:
1. 创建 SpringApplication 对象
调用 new SpringApplication(primarySources),完成:
- 推断应用类型(Servlet、Reactive、None)
- 加载
ApplicationContextInitializer(初始化ApplicationContext) - 加载
ApplicationListener(监听 Spring Boot 事件) - 确定主类(包含
main方法的@SpringBootApplication类)
2. 执行 run() 方法
SpringApplication.run() 触发 Spring Boot 核心启动流程:
① 启动 SpringApplicationRunListeners
- 加载
META-INF/spring.factories里的SpringApplicationRunListener - 触发
starting()事件(日志、监控初始化)
② 构建 ApplicationEnvironment
- 解析
application.properties/application.yml - 处理 命令行参数、环境变量、系统属性
③ 创建 ApplicationContext
根据应用类型创建:
- Web 应用:
AnnotationConfigServletWebServerApplicationContext - 非 Web 应用:
AnnotationConfigApplicationContext
3. 准备 ApplicationContext
① 调用 ApplicationContextInitializer
- 允许开发者自定义
ApplicationContext初始化逻辑
② 加载 BeanDefinition
- 解析
@ComponentScan扫描的 Bean - 解析
@Configuration解析@Bean方法 - 解析
spring.factories里的 自动配置类
③ BeanFactoryPostProcessor 执行
- 修改 Bean 定义(如
@ConditionalOnMissingBean处理) - 解析
@ConfigurationProperties
4. refresh() 刷新 ApplicationContext
① 注册 BeanPostProcessor
AutowiredAnnotationBeanPostProcessor处理@AutowiredCommonAnnotationBeanPostProcessor处理@Resource
② 实例化单例 Bean
- 解析
@Autowired依赖注入 @PostConstruct方法执行- 若有 AOP,生成代理对象
③ 启动 Web 服务器
Tomcat/Jetty/Undertow- 注册
DispatcherServlet
5. 执行 ApplicationRunner / CommandLineRunner
ApplicationRunner处理run(ApplicationArguments args)CommandLineRunner处理run(String... args)
6. 触发 ApplicationReadyEvent
ApplicationListener监听ApplicationReadyEvent- 说明 Spring Boot 启动完成,正式运行
总结
- 初始化
SpringApplication - 构建
ApplicationContext - 解析配置 & Bean 加载
refresh()刷新上下文- 启动 Web 容器
- 执行
ApplicationRunner - 触发
ApplicationReadyEvent
这一过程确保 Spring Boot 应用能够 自动配置、加载 Bean、运行 Web 服务器,并触发各种事件。
