Spring-ApplicationContext-Web

本文最后更新于:5 个月前

我们将以常见的Web应用开发对ApplicationContext进行展开,本篇文章将初步介绍Spring Boot提供了构建两种主要Web应用模型的能力:传统的基于Servlet的模型和新兴的基于响应式编程的模型。本文将探索这两种模型的特点、适用场景以及对应的类图。

简介

基于Spring Boot实现的Web应用可分为两类

  • 传统的Servlet Web应用
  • 响应式Web应用

适用场景

Servlet Web

  • 当应用不需要处理大量的并发请求或实时数据流。
  • 当与传统数据库进行频繁交互,且数据库交互本身是阻塞式的。
  • 企业内部管理系统,用户交互不频繁,数据处理量大但并发需求低。

响应式Web

  • 当应用需处理大量的并发请求,且每个请求涉及的数据处理不会阻塞线程,如请求可以异步处理。
  • 在微服务之间需要高吞吐量的消息传递时。
  • 需要与非阻塞的客户端(如现代Web浏览器)或服务进行交互,特别是使用WebSockets或Server-Sent Events。

应用领域

Servlet Web

  • 传统的企业级应用:例如,需要与JDBC、JPA等传统数据库交互,以及集成多种服务(如JMS、Email服务等)的系统。
  • 阻塞式操作:应用中大量操作是阻塞式的,如文件处理、同步HTTP调用等,且这些操作没有明显的性能瓶颈或需求。
  • 成熟的技术栈支持:利用广泛的第三方库和框架,这些通常是为阻塞式环境设计的。

响应式Web

  • 实时数据处理应用:如实时消息服务、实时数据监控和分析等。
  • 高并发应用:适用于需要高效处理大量并发连接和网络交互的应用,如在线游戏服务器、大规模聊天应用。
  • 微服务架构:在基于微服务的架构中,响应式编程可以提高服务之间的通信效率,尤其是在使用事件驱动架构时。

辨别

依赖关系

检查项目的构建配置文件,确定项目引用了哪些Spring Boot Starter

  • Servlet Web应用:通常会包含spring-boot-starter-web,它依赖于spring-webmvc,这表明使用的是 Servlet API

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  • 响应式Web应用:则会包含spring-boot-starter-webflux,它依赖于spring-webflux模块。

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

启动日志

  • Servlet Web应用:使用Servlet API,默认使用的Java Web应用服务器为Tomcat,启动时会报如下日志

    1
    2
    3
    4
    5
    6
    INFO 14560 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
    INFO 14560 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
    INFO 14560 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83]
    INFO 14560 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
    INFO 14560 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 563 ms
    INFO 14560 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
  • 响应式Web应用:使用响应式Web框架Web Flux,默认使用Netty作为服务器,启动时会报如下日志

    1
    INFO 13688 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port 8080

代码实现

观察应用中的控制器实现:

  • Servlet Web应用:控制器可能使用@RestController@RequestMapping@GetMapping@PostMapping等注解,且处理方法通常返回ModelAndViewStringResponseEntity

    1
    2
    3
    4
    5
    6
    7
    @RestController
    public class MyController {
    @GetMapping("/hello")
    public ResponseEntity<String> sayHello() {
    return ResponseEntity.ok("Hello World");
    }
    }
  • 响应式Web应用:控制器可能使用@RestController@GetMapping等注解,但处理方法返回的是Mono<T>Flux<T>类型。

    1
    2
    3
    4
    5
    6
    7
    @RestController
    public class MyReactiveController {
    @GetMapping("/hello")
    public Mono<String> sayHello() {
    return Mono.just("Hello World");
    }
    }

最终实现

关于应用上下文的最终实现:

Servlet Web

最终实现为AnnotationConfigServletWebServerApplicationContext,类图如下

AnnotationConfigServletWebServerApplicationContext类图

响应式Web

最终实现为AnnotationConfigReactiveWebServerApplicationContext,类图如下

AnnotationConfigReactiveWebServerApplicationContext类图

总结

本篇文章简单介绍了基于Spring Boot的Servlet Web应用和响应式Web应用的设计理念和实现方式,这也是开发中最常见的Spring Boot开发模型,下一篇我们将对两种Web应用的ApplicationContext实现进行展开,探究各类应用上下文的特点。