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
处理@Autowired
CommonAnnotationBeanPostProcessor
处理@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 服务器,并触发各种事件。