Spring Boot 是一个基于 Spring 框架的快速开发、方便部署的框架,它简化了 Spring 应用程序的构建和部署过程。
Spring Boot 启动流程
1. 加载配置文件:Spring Boot 应用程序的配置信息存储在 application.properties 或 application.yml 配置文件中。在启动过程中,Spring Boot 会通过 Loaders 加载配置文件,并将其应用到应用程序上下文中。
2. 创建应用程序上下文:Spring Boot 根据配置文件创建应用程序上下文。应用程序上下文是 Spring 的核心容器,用于管理和组织应用程序的各个组件。
3. 扫描组件:Spring Boot 会扫描应用程序上下文中的包,并根据配置进行组件的扫描和加载。扫描到的组件可以是控制器、服务、存储库等。
4. 注入依赖:Spring Boot 使用依赖注入来管理组件之间的依赖关系。通过依赖注入,Spring Boot 将需要的组件注入到其他组件中,形成组件之间的依赖关系。
5. 自动配置:Spring Boot 的核心特性是自动配置,它根据应用程序的依赖关系和配置文件,自动配置和装配应用程序所需要的各种组件和功能。自动配置大大简化了应用程序的配置过程。
6. 启动应用程序:通过调用 SpringApplication.run() 方法或创建一个 Spring Boot 应用程序的实例来启动应用程序。该方法将触发应用程序的启动,并将控制权交给 Spring 框架。
7. 处理 Web 请求:如果应用程序是一个 Web 应用程序,Spring Boot 会根据配置启动一个嵌入式的 Web 服务器,并处理传入的 Web 请求。Spring Boot 内置支持多种 Web 服务器,如 Tomcat、Jetty 和 Undertow。
8. 运行应用程序:Spring Boot 会运行应用程序的主线程,处理请求和响应,并将结果返回给客户端。同时,Spring Boot 还提供了很多功能,如安全性、日志记录、监视和管理等。
核心源码分析
SpringApplication 类的 run() 方法,它会调用 Spring Boot 的各个初始化器进行初始化和准备工作。
public ConfigurableApplicationContext run(String... args) {
// 启动计时器
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 定义应用程序上下文和异常报告器列表
ConfigurableApplicationContext context = null;
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
// 配置 Headless 属性
configureHeadlessProperty();
// 获取 Spring Boot 启动监听器
SpringApplicationRunListeners listeners = getRunListeners(args);
// 执行启动监听器的 starting 方法
listeners.starting();
try {
// 解析命令行参数
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
// 准备应用程序环境
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
// 配置忽略 BeanInfo
configureIgnoreBeanInfo(environment);
// 打印 Banner
Banner printedBanner = printBanner(environment);
// 创建应用程序上下文
context = createApplicationContext();
// 获取异常报告器,关于异常报告,我下次专门讲一下SpringBoot 的异常收集器。
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
// 准备应用程序上下文
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
// 刷新应用程序上下文
refreshContext(context);
// 刷新后操作
afterRefresh(context, applicationArguments);
// 停止计时器
stopWatch.stop();
// 记录启动日志
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
}
// 执行启动监听器的 started 方法
listeners.started(context);
// 执行 Runner
callRunners(context, applicationArguments);
} catch (Throwable ex) {
// 处理启动失败
handleRunFailure(context, ex, exceptionReporters, listeners);
throw new IllegalStateException(ex);
}
try {
// 执行启动监听器的 running 方法
listeners.running(context);
} catch (Throwable ex) {
// 处理启动失败
handleRunFailure(context, ex, exceptionReporters, null);
throw new IllegalStateException(ex);
}
// 返回应用程序上下文
return context;
}
1. Spring Boot 通过 `SpringApplication` 类的 `run` 方法启动应用程序。
2. 在启动过程中,`SpringApplication` 负责创建应用程序的上下文。
3. `SpringApplication` 使用 `
SpringApplicationRunListeners` 来通知应用程序启动过程中的事件。
4. `
springApplicationRunListeners` 调用 `starting()` 方法,该方法用于通知应用程序的启动开始。
5. `SpringApplication` 根据不同的条件决定创建合适的 `ApplicationContext`。
6. 使用 `SpringApplication` 的默认参数创建并配置 `ApplicationContext`。
7. 通过 `SpringApplication` 的 `prepareContext()` 方法,准备要使用的应用程序上下文。
8. 使用 `SpringApplication` 的默认参数创建并配置 `BeanDefinitionLoader`。
9. `BeanDefinitionLoader` 加载 `ApplicationContext` 中的 bean 定义。
10. `SpringApplication` 初始化 `ApplicationContext`。
11. 通过读取 `SpringApplication` 的属性,初始化 `ApplicationContext` 的环境。
12. `SpringApplication` 加载项目的配置文件。
13. 解析 `application.properties` 文件中的配置项,将其转换为 Spring Boot 属性。
14. 在启动过程中,`SpringApplication` 使用 `
SpringApplicationRunListeners` 来通知应用程序运行过程中的事件。
15. `
springApplicationRunListeners` 调用 `environmentPrepared()` 方法,该方法用于通知应用程序的环境配置完成。
16. `SpringApplication` 在应用程序的上下文中注册 `
ApplicationContextInitializer`。
17. `SpringApplication` 加载应用程序中的 `
SpringApplicationRunListener`。
18. `SpringApplication` 使用 `
SpringApplicationRunListeners` 来通知应用程序准备阶段的事件。
19. `
springApplicationRunListeners` 调用 `contextPrepared()` 方法,该方法用于通知应用程序的上下文准备完成。
20. `SpringApplication` 加载应用程序的 `ApplicationRunner` 和 `CommandLineRunner`。
21. `SpringApplication` 创建并刷新 `ApplicationContext`。
22. `SpringApplication` 使用注册的 `
ApplicationContextInitializers` 初始化 `ApplicationContext`。
23. `SpringApplication` 刷新上下文并调用 `onRefresh()` 方法。
24. `SpringApplication` 解析并启动 `Spring Boot` 的 `EmbeddedWebServer`。
25. `EmbeddedWebServer` 启动应用程序的 Web 服务器。
26. `EmbeddedWebServer` 注册 `DispatcherServlet`。
27. `DispatcherServlet` 处理 Web 请求,并将其分发给合适的控制器。
28. `SpringApplication` 使用 `
SpringApplicationRunListeners`来通知应用程序启动完成的事件。
29. `
springApplicationRunListeners` 调用 `started()` 方法,该方法用于通知应用程序的启动完成。
30. 应用程序启动完成后,就可以接收和处理用户请求了。
以上是关于 Spring Boot 启动流程的主要步骤和源码说明。要深入了解 Spring Boot 的启动流程和源码实现,建议查阅官方文档和源码。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 8838832@qq.com 举报,一经查实,本站将立刻删除。文章链接:https://www.wllpr.com/124802.html