Springboot容器启动过程
Spring Boot 应用程序的启动过程是一个精心设计的流程,它自动化了传统 Spring 应用中繁琐的配置和启动步骤。整个过程的核心围绕 SpringApplication.run() 方法展开,该方法引导了 Spring 应用上下文(IoC 容器)的创建、配置和启动。
1. 启动入口:SpringApplication.run()
每个 Spring Boot 项目都有一个主启动类,其中包含一个 main 方法,该方法通常只有一行代码:SpringApplication.run(MyApplication.class, args);。 这行代码是整个启动流程的起点。
SpringApplication.run() 静态方法的执行主要分为两个阶段:
* 创建 SpringApplication 实例:首先会创建一个 SpringApplication 类的对象。
* 调用实例的 run() 方法:然后利用创建的实例来调用其 run() 方法。
2. SpringApplication 对象的初始化
在 SpringApplication 的构造函数中,会执行一系列初始化操作:
* 推断应用类型:Spring Boot 会检查类路径下的特定类来判断应用的类型。例如,如果类路径下存在 spring-webmvc,它会推断这是一个基于 Servlet 的 Web 应用。
* 加载初始化器和监听器:它会从 META-INF/spring.factories 文件中加载 ApplicationContextInitializer 和 ApplicationListener 的实现类。这些类用于在 Spring 容器的不同生命周期阶段执行自定义逻辑。
* 设置主配置类:确定包含 main 方法的主启动类,以便后续进行组件扫描。
3. 执行 run 方法:核心启动流程
SpringApplication 实例的 run 方法是整个启动过程的核心,它负责创建和配置 Spring 容器。 这个过程可以概括为以下几个关键步骤:
准备环境 (Environment)
Spring Boot 会创建一个 Environment 对象,用于管理应用的配置属性。 它会加载各种来源的配置,包括:
* application.properties 或 application.yml 文件。
* 命令行参数。
* 系统属性和环境变量。
创建应用上下文 (ApplicationContext)
根据之前推断的应用类型,Spring Boot 会创建相应类型的 ApplicationContext(即 IoC 容器)。
* 对于非 Web 应用,通常创建 AnnotationConfigApplicationContext。
* 对于基于 Servlet 的 Web 应用,会创建 AnnotationConfigServletWebServerApplicationContext。
准备和刷新上下文
在容器刷新之前,会执行一些准备工作,例如将初始化器应用于上下文,并发布应用启动早期的事件。
随后,最关键的一步是调用 ApplicationContext 的 refresh() 方法。 这个方法触发了 Spring 容器的整个生命周期,包括:
- Bean 的加载和实例化:Spring 容器会扫描主配置类所在的包及其子包,查找并注册所有被
@Component、@Service、@Repository、@Controller等注解标记的类作为 Bean。 - 自动配置 (Auto-configuration):这是 Spring Boot 的核心特性之一。
- 启动自动配置的起点是
@SpringBootApplication注解,它包含了@EnableAutoConfiguration。 @EnableAutoConfiguration通过@Import(AutoConfigurationImportSelector.class)来加载自动配置类。AutoConfigurationImportSelector会扫描所有 jar 包中META-INF/spring.factories文件,获取org.springframework.boot.autoconfigure.EnableAutoConfiguration键下的所有自动配置类。- 每个自动配置类通常都带有一系列的
@Conditional注解,Spring Boot 会根据当前环境(例如,类路径上是否存在某个特定的类、某个属性是否被设置等)来决定是否要应用这个配置,从而实现按需加载。 例如,当你在项目中加入了spring-boot-starter-web依赖时,Spring Boot 会自动配置 Tomcat、DispatcherServlet 等 Web 开发所需的 Bean。
- 启动自动配置的起点是
启动内嵌 Web 服务器
如果应用是一个 Web 应用,在容器刷新过程中,会创建并启动内嵌的 Web 服务器(默认为 Tomcat)。
* Spring Boot 通过 ServletWebServerApplicationContext 来处理内嵌 Web 服务器的启动。
* 它会根据类路径上的依赖来决定使用哪种服务器(Tomcat、Jetty 或 Undertow)。
* 服务器启动后,会开始监听指定的端口(默认为 8080),准备接收客户端请求。
4. 启动完成
在容器刷新和 Web 服务器启动之后,run 方法会执行一些收尾工作,例如调用 ApplicationRunner 和 CommandLineRunner 接口的实现,允许用户在应用启动后执行一些自定义的初始化代码。至此,Spring Boot 容器的启动过程就全部完成了。
总结来说,Spring Boot 的启动流程是一个高度自动化和可扩展的过程,它通过约定大于配置的思想,利用自动配置和内嵌 Web 服务器等特性,极大地简化了 Spring 应用的开发、配置和部署。