Spring Boot 的启动流程是一个相对复杂但有序的过程,它涉及多个组件和步骤的协同工作。以下是 Spring Boot 启动流程的详细解析:
一、初始化阶段
-
启动入口
- Spring Boot 应用的启动入口通常是一个包含
main
方法的类,该类上标注了@SpringBootApplication
注解。@SpringBootApplication
是一个组合注解,它包含了@Configuration
、@EnableAutoConfiguration
和@ComponentScan
等核心注解,用于开启自动配置和组件扫描。
- Spring Boot 应用的启动入口通常是一个包含
-
创建应用上下文
- 在
main
方法中,通过调用SpringApplication.run()
方法启动应用。该方法会创建一个SpringApplication
实例,并调用其run()
方法。 SpringApplication
实例在创建过程中会初始化应用上下文(ApplicationContext
),这是 Spring 框架的核心容器,用于管理应用中的所有 Bean。
- 在
二、环境准备阶段
-
加载配置文件
- Spring Boot 会自动加载
application.properties
或application.yml
等配置文件,这些文件包含了应用的配置信息,如数据库连接、服务器端口等。 - 配置文件中的属性会被绑定到
Environment
对象中,供应用上下文使用。
- Spring Boot 会自动加载
-
确定应用类型
SpringApplication
会根据应用的依赖和配置,确定应用类型(如 Web 应用、非 Web 应用等),并据此初始化相应的应用上下文。
三、组件扫描与自动配置阶段
-
组件扫描
@ComponentScan
注解会触发组件扫描,Spring Boot 会扫描指定包及其子包下的所有类,查找带有@Component
、@Service
、@Repository
、@Controller
等注解的类,并将它们注册为 Spring 容器中的 Bean。
-
自动配置
@EnableAutoConfiguration
注解会启用 Spring Boot 的自动配置机制。Spring Boot 会根据应用的依赖和配置,自动配置应用所需的 Bean 和组件。- 自动配置基于
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中的配置类列表,这些配置类会根据条件(如类路径中是否存在特定类、配置属性是否满足等)决定是否生效。
四、Bean 初始化与依赖注入阶段
-
Bean 初始化
- 在应用上下文初始化完成后,Spring Boot 会开始初始化所有的 Bean。这包括调用 Bean 的构造函数、设置属性等。
- 对于带有
@PostConstruct
注解的方法,Spring Boot 会在 Bean 初始化完成后调用这些方法,执行一些初始化逻辑。
-
依赖注入
- 在 Bean 初始化过程中,Spring Boot 会根据 Bean 的依赖关系,自动注入所需的依赖。这包括通过构造函数注入、Setter 方法注入或字段注入等方式。
五、应用启动完成阶段
-
启动监听器回调
- 在应用启动完成后,Spring Boot 会调用所有注册的
ApplicationListener
的onApplicationEvent
方法,通知它们应用已经启动完成。 - 这可以用于执行一些启动完成后的逻辑,如发送启动完成通知、初始化缓存等。
- 在应用启动完成后,Spring Boot 会调用所有注册的
-
启动 Web 服务器(如果是 Web 应用)
- 对于 Web 应用,Spring Boot 会启动内置的 Web 服务器(如 Tomcat、Jetty 或 Undertow),并监听指定的端口,等待客户端请求。
总结
Spring Boot 的启动流程是一个从初始化到环境准备,再到组件扫描与自动配置,最后到 Bean 初始化与依赖注入,以及应用启动完成的完整过程。在这个过程中,Spring Boot 充分利用了 Spring 框架的核心特性,如依赖注入、面向切面编程等,同时提供了自动配置、组件扫描等便捷功能,大大简化了 Spring 应用的开发和部署。