8. Spring Boot 是如何通过 main 方法启动 web 项目的?
大约 3 分钟
Spring Boot 通过 main
方法启动 Web 项目的过程,涉及了多个关键步骤。Spring Boot 项目作为一个独立的 Java 应用程序运行,利用了 Spring 的核心功能,同时也借助了 Spring Boot 的自动配置和嵌入式服务器的特性。下面是详细的启动过程解析:
1. main
方法启动
每个 Spring Boot 项目都会有一个包含 main
方法的主类,这个类通常被标记为 @SpringBootApplication
。
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
SpringApplication.run(MyApplication.class, args)
是启动 Spring Boot 应用的入口。
2. @SpringBootApplication
注解
@SpringBootApplication
是一个组合注解,包含以下几个重要注解:
@SpringBootConfiguration
:是@Configuration
的特殊形式,用于标识当前类为配置类,等价于 Spring 的 XML 配置文件。@EnableAutoConfiguration
:启用 Spring Boot 的自动配置机制,自动配置 Web、JPA、缓存等常用功能。@ComponentScan
:自动扫描和发现指定包及其子包中的 Spring 组件(如@Component
、@Service
、@Repository
、@Controller
等注解标记的类)。
3. SpringApplication.run()
方法详解
SpringApplication.run()
是启动 Spring Boot 应用的核心方法。它的主要功能包括:
- 创建
SpringApplication
对象:- 该对象封装了 Spring Boot 应用的启动配置,如设置应用类型、是否需要 Web 环境等。
- 判断当前应用类型,设置为
Web
应用(通过自动检测类路径中的javax.servlet.Servlet
类)。
- 启动
Spring
容器:- 通过
SpringApplication
的run
方法,启动 Spring 的ApplicationContext
,通常是AnnotationConfigServletWebServerApplicationContext
,它是一个专门为 Web 应用设计的 Spring 容器。 - 加载 Spring Bean,并完成依赖注入和初始化。
- 通过
- 加载自动配置类:
@EnableAutoConfiguration
注解会触发自动配置机制,加载spring.factories
文件中定义的所有自动配置类,并根据条件注解(如@ConditionalOnClass
、@ConditionalOnProperty
)的结果,决定是否激活相应的配置。
- 启动嵌入式 Web 服务器:
- Spring Boot 检测到 Web 应用后,会自动启动嵌入式的 Web 服务器(如 Tomcat、Jetty、Undertow)。
- 通过自动配置类,如
TomcatServletWebServerFactory
,JettyServletWebServerFactory
等,创建并启动嵌入式的 Web 服务器。
- 启动 Spring MVC 或 Spring WebFlux:
- 如果是 Servlet 应用,则启动 Spring MVC,配置 DispatcherServlet、HandlerMapping、HandlerAdapter 等核心组件。
- 如果是反应式 Web 应用,则启动 Spring WebFlux。
- 运行
CommandLineRunner
和ApplicationRunner
:- 如果应用中定义了实现
CommandLineRunner
或ApplicationRunner
接口的 Bean,这些 Bean 会在容器启动完成后执行,用于执行一些启动后的初始化任务。
- 如果应用中定义了实现
- 应用启动完成:
- 一旦 Web 服务器启动,并且 Spring 容器初始化完成,Spring Boot 应用就可以接受 HTTP 请求了。
4. 嵌入式 Web 服务器的启动
Spring Boot 内置了常用的 Web 服务器(如 Tomcat、Jetty、Undertow),这些服务器作为应用的一部分被打包,随应用一起启动。
- 当 Spring Boot 检测到是 Web 应用时,会自动创建并启动一个嵌入式的 Web 服务器。
- 通过自动配置类,如
TomcatServletWebServerFactory
,Spring Boot 会创建和配置一个Tomcat
实例,启动该实例并监听配置的端口。 - 嵌入式服务器启动后,Spring 的
DispatcherServlet
被注册到服务器中,开始处理 HTTP 请求。
5. 总结
Spring Boot 通过 main
方法启动 Web 项目的过程,大致可以分为以下几个步骤:
- 通过
SpringApplication.run()
方法启动 Spring 容器。 - 根据项目配置和依赖,加载自动配置类,配置 Spring 环境。
- 启动嵌入式 Web 服务器,如 Tomcat。
- 初始化 Web 相关的 Spring 组件,如
DispatcherServlet
,并开始处理请求。
Spring Boot 的这一启动过程结合了 Spring 的强大功能和自动配置的便捷性,使得开发者无需编写大量配置文件和代码即可快速启动一个功能齐全的 Web 应用。