该判断题表述为:“Spring Boot启动过程中会判断当前应用类型是Web应用还是Reactive Web应用。”
这个说法是 正确的。Spring Boot 的自动配置机制会检查类路径,以确定是将应用程序配置为传统的 Servlet Web 应用还是 Reactive Web 应用。
Spring Boot 中的 Web 应用与 Reactive Web 应用 🌐⚡
Spring Boot 支持两种截然不同的编程模型来构建 Web 应用程序:
Web 应用 (Servlet 技术栈)
- 核心技术:构建于 Servlet API (例如
javax.servlet
或jakarta.servlet
) 之上。 - 默认 Web 服务器:通常使用嵌入式服务器,如 Tomcat (默认)、Jetty 或 Undertow。
- 编程模型:主要是命令式和阻塞式。每个传入的请求都由线程池中的一个专用线程处理。如果该线程执行阻塞操作(如对数据库或另一服务的 I/O),它将保持阻塞状态,直到操作完成,从而消耗资源。
- 关键框架:Spring MVC (
spring-webmvc
) 是用于构建这些应用程序的框架。它历史悠久,拥有庞大的生态系统和同步的、每个请求一个线程的模型。 - 依赖项:通过
pom.xml
或build.gradle
文件中的spring-boot-starter-web
来表明。此启动器会引入 Spring MVC 和像 Tomcat 这样的嵌入式 servlet 容器。 - 使用场景:
- 传统的 Web 应用程序和 REST API。
- 阻塞式 I/O 可接受或不可避免的应用程序。
- 具有现有 Spring MVC 代码库或严重依赖 Servlet 特定功能的项目。
- 对于熟悉传统 Web 框架的开发人员来说,其逻辑更简单。
Reactive Web 应用 (Reactive 技术栈)
- 核心技术:构建于 Project Reactor (或 RxJava) 和非阻塞 I/O 之上。
- 默认 Web 服务器:通常使用嵌入式服务器,如 Netty (默认)、Tomcat (有限制)、Jetty 或 Undertow,它们都能够处理非阻塞 I/O。
- 编程模型:声明式、异步和非阻塞。它旨在使用少量线程(事件循环)处理许多并发请求。传统上会阻塞的操作(如 I/O)会返回一个发布者(Project Reactor 中的
Mono
或Flux
),该发布者将在数据可用时发出数据,而不会阻塞处理线程。 - 关键框架:Spring WebFlux (
spring-webflux
) 是用于构建响应式 Web 应用程序的框架。它支持两种编程模型:- 基于注解:类似于 Spring MVC (使用
@Controller
,@GetMapping
等),但具有响应式返回类型,如Mono<User>
或Flux<Order>
。 - 函数式:一种更程序化的方式,使用
RouterFunction
和HandlerFunction
定义路由和处理器。
- 基于注解:类似于 Spring MVC (使用
- 依赖项:通过
pom.xml
或build.gradle
文件中的spring-boot-starter-webflux
来表明。此启动器会引入 Spring WebFlux 和像 Netty 这样的响应式 Web 服务器。 - 使用场景:
- 需要以最少的资源使用处理大量并发连接的高并发应用程序(例如,微服务、流式 API、实时应用程序)。
- 需要对外部服务进行大量调用,并可以从非阻塞 I/O 中受益以提高响应能力和资源效率的应用程序。