SpringBoot启动流程在Java面试经常被问到,下面我就来详解9大SpringBoot启动流程@mikechen
SpringBoot启动入口
我们开发任何一个Spring Boot项目,都会用到如下的启动类:
我们点击这个注解,@SpringBootApplication,如下图所示:
@SpringBootApplication 会包含以下三个注解的功能:
- @Configuration:将类标记为 Spring 应用程序上下文中的 Bean 定义的源。
- @EnableAutoConfiguration:告诉 Spring Boot 根据类路径中的 jar 包依赖为当前项目自动配置 Bean。
- @ComponentScan:告诉 Spring 扫描包以查找其他组件、配置和服务。
通过使用 @SpringBootApplication 注解,可以将这三个注解的功能整合在一起,从而简化应用程序的配置。
SpringBoot启动流程
刚刚谈了@SpringBootApplication 注解,可以让 Spring Boot 自动帮我们完成很多常用的配置。
有了自动配置之后,另外一个SpringBoot启动流程的核心关键点就是SpringApplication.run方法了。
SpringApplication.run 方法是 Spring Boot 应用程序启动的核心方法,它负责初始化应用程序的 Spring 上下文环境,启动 Web 服务器,执行应用程序的逻辑代码等。
启动过程,如下图所示:
下面是 SpringApplication.run 方法启动的流程:
- 创建 SpringApplication 对象:首先,SpringApplication.run 方法会创建一个 SpringApplication 对象,用于管理 Spring 应用程序上下文和启动应用程序。
- 解析启动参数:SpringApplication.run 方法会解析启动应用程序时传入的参数,例如配置文件的位置、激活的配置文件、命令行参数等。
- 配置 Spring 应用程序上下文:SpringApplication.run 方法会根据解析到的配置参数和自动配置,配置应用程序的 Spring 上下文环境,包括设置应用程序的 ClassLoader、Environment、ResourceLoader、BeanFactory 等。
- 准备 Spring 应用程序上下文:SpringApplication.run 方法会为应用程序上下文做一些准备工作,例如添加 Spring Boot 默认的 PropertySource、设置默认的 Web 应用程序上下文等。
- 执行 SpringApplicationRunListeners:SpringApplication.run 方法会执行所有注册的 SpringApplicationRunListener 实例,在应用程序启动前和启动后分别触发它们的事件。
- 创建并刷新 Spring 应用程序上下文:SpringApplication.run 方法会创建一个 ApplicationContext 对象,并将配置好的 Bean 加载到 ApplicationContext 中。然后,它会调用 ApplicationContext.refresh() 方法,启动应用程序上下文。
- 启动 Web 服务器:如果应用程序中包含 Web 组件,例如 Spring MVC,那么 SpringApplication.run 方法会自动启动内嵌的 Tomcat、Jetty 或 Undertow 等 Web 服务器,以便应用程序能够处理 Web 请求。
- 执行 SpringApplicationRunListeners:应用程序启动完成后,SpringApplication.run 方法会再次执行所有注册的 SpringApplicationRunListener 实例,触发它们的应用程序启动完成事件。
- 执行 ApplicationRunner 和 CommandLineRunner:最后,SpringApplication.run 方法会执行所有实现了 ApplicationRunner 或 CommandLineRunner 接口的 Bean 的 run 方法,以便让这些 Bean 执行一些额外的任务。
以上就是SpringBoot启动流程详解,更多SpringBoot内容请查看:SpringBoot框架教程(详细图文详解)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》