Spring Boot 启动过程详解
Spring Boot 是一个用于快速开发独立的、生产级别的基于 Spring 框架的应用的工具。它简化了基于 Spring 的应用开发,特别是微服务的开发。下面是 Spring Boot 应用的启动过程的详细解析。
1. main 方法入口
一切从main方法开始。Spring Boot 应用的入口点是包含main方法的类,该类通常使用@SpringBootApplication注解标记。
/**应用从main()方法启动,并通过SpringApplication.run()引导应用启动。其中main方法中的@SpringBootApplication注解是一个组合注解,包含了三个核心注解:@SpringBootConfiguration:相当于@Configuration,表示该类是Spring配置类。@EnableAutoConfiguration:启动自动配置功能。@ComponentScan:启用组件扫描,默认扫描当前包及其子包下的Spring组件(如@Service、@Controller、@Repository)等。**/@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
其中SpringApplication.run() 是启动 Spring Boot 应用的核心。它执行了以下关键步骤:
1) 创建SpringApplication对象
首先,它会创建一个新的SpringApplication实例。这个实例负责管理应用的启动。
2) 推断应用的类型
Spring Boot 会推断应用是普通的 Spring 应用还是 Web 应用(Servlet 或 Reactive 类型)。
3) 初始化ApplicationContext
根据应用的类型,Spring Boot 会选择创建一个合适的ApplicationContext实例(例如AnnotationConfigApplicationContext或AnnotationConfigServletWebServerApplicationContext)。
4) 准备环境
Spring Boot 会准备Environment,用于配置应用。这包括读取配置文件、系统属性、环境变量等。
5) 应用初始化器
应用初始化器ApplicationContextInitializer会被调用,它们可以在ApplicationContext被刷新之前对其进行进一步的设置或处理。
6) 执行监听器
各种事件监听器ApplicationListener会被触发,以响应不同的应用生命周期事件。
7) 加载源
SpringApplication会加载应用的主配置类(通常是使用@SpringBootApplication注解的类)。
8) 刷新ApplicationContext
ApplicationContext会被刷新,这将导致 Spring 容器加载所有的单例 beans。
9) 执行命令行运行器
如果有的话,CommandLineRunner和ApplicationRunnerbeans 会被执行。
10) 启动内嵌服务器
如果是 Web 应用,Spring Boot 会启动内嵌的服务器(比如 Tomcat、Jetty 或 Undertow)。
11) 应用准备完成
最后,ApplicationReadyEvent会被发布,表示应用已经准备好接受请求。
3. 应用运行
此时,Spring Boot 应用已经启动并且运行中。它会持续运行,直到被关闭或者遇到中断。
4. 应用关闭
当应用关闭时,ApplicationContext会被关闭,这会导致ContextClosedEvent事件的发布。所有的标准清理步骤,如调用DisposableBean的destroy方法和关闭日志系统,都会在这个阶段执行。
以上就是 Spring Boot 应用的启动过程的详细解析。这个过程涉及了许多 Spring 框架的核心概念,如依赖注入、事件发布、环境抽象等。通过这个过程,Spring Boot 使得启动和运行基于 Spring 的应用变得更加简单和快速。