1. 启动入口
Spring Boot 应用的启动入口通常是一个包含 `@SpringBootApplication` 注解的主类,并调用 `SpringApplication.run()` 方法。`@SpringBootApplication` 是一个复合注解,包含了 `@Configuration`、`@EnableAutoConfiguration` 和 `@ComponentScan`,从而开启了自动配置和组件扫描。
### 2. SpringApplication.run() 方法
- **创建 SpringApplication 实例**:通过构造方法初始化 Spring Boot 环境,包括资源加载器、主方法类等。
- **初始化环境和监听器**:设置启动的 Environment,并且添加 ApplicationListener 监听器。
- **准备和刷新 Spring 上下文**:通过 `prepareContext()` 和 `refreshContext()` 方法进行上下文环境的准备和刷新。
### 3. 自动配置
Spring Boot 使用 `@EnableAutoConfiguration` 注解触发自动配置,核心实现是在 `AutoConfigurationImportSelector` 中加载 `META-INF/spring.factories` 配置文件,文件中列出了许多自动配置类(如 `DataSourceAutoConfiguration`、`JpaRepositoriesAutoConfiguration` 等),根据条件(例如某些 Bean 是否存在、某些属性是否被配置等)加载相应的自动配置。
### 4. Bean 加载与注册
在 `refreshContext()` 方法中,Spring Boot 调用 `refresh()` 方法,完成了 BeanFactory 的初始化和 BeanPostProcessor 的注册,并解析 `@Component`、`@Service`、`@Repository` 等注解标注的 Bean 定义,将它们注册到 BeanFactory 中。
### 5. Web 环境中的嵌入式容器启动
在 Web 应用中,Spring Boot 会启动嵌入式 Web 容器(如 Tomcat 或 Jetty)。Spring Boot 默认通过 `ServletWebServerApplicationContext` 启动内嵌的 Web 服务器。在 `refresh()` 的最后,会启动嵌入式容器,将应用作为 Web 应用发布。
### 6. 执行 ApplicationRunner 和 CommandLineRunner
Spring Boot 启动完成后,会扫描并执行所有实现了 `ApplicationRunner` 和 `CommandLineRunner` 接口的 Bean。它们可以用于在启动后执行自定义逻辑。
### 7. 发布应用启动完成事件
最后,Spring Boot 发布 `ApplicationReadyEvent` 事件,通知所有监听器应用已启动完成。至此,Spring Boot 应用正式启动完成,可以接收 HTTP 请求或执行其他任务