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
6INFO 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
等注解,且处理方法通常返回ModelAndView
、String
或ResponseEntity
。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
,类图如下
响应式Web
最终实现为AnnotationConfigReactiveWebServerApplicationContext
,类图如下
总结
本篇文章简单介绍了基于Spring Boot的Servlet Web应用和响应式Web应用的设计理念和实现方式,这也是开发中最常见的Spring Boot开发模型,下一篇我们将对两种Web应用的ApplicationContext实现进行展开,探究各类应用上下文的特点。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!