Spring Web

1.5K
0
0
最后修改于

spring-web定义了 Spring Web 开发中其他框架(webmvc,webflux)的通用接口以及工具类。

但是从历史的角度来说,
spring-web 本来是作为 webmvc 这一系列框架 (mvc, portlet) 的基础接口进行设计的,因此有些面向 servlet 的默认实现,显得有些耦合。
现在则是作为 webmvc,webflux 的基础框架,提供一些通用抽象、接口。

从项目结构来看分为 http,remoting,web三个部分
下面逐一分析每个部分所提供的抽象

Http#

├── http
│   ├── client
│   │   ├── reactive
│   │   └── support
│   ├── codec
│   ├── converter
│   └── server
│       └── reactive


HttpMessage(带有header,表示 HTTP 请求和响应消息的基本接口)
HttpInputMessage(继承HttpMessage,带有Body,表示 HTTP 输入消息的基本接口, 客户端响应/服务端请求)

HttpOutputMessage(继承HttpMessage,带有Body,表示 HTTP 输出消息的基本接口, 客户端请求/服务端响应)
另外有 StreamingHttpOutputMessage/ZeroCopyHttpOutputMessage


Input/OutputMessage 的 Body 是还未序列化/反序列化 的 InputStream/OutputStream

ReactiveHttpInputMessage/ReactiveHttpOutputMessage类似,但是持有的 body 是封装后的 Buffer

HttpEntity<T>(带有header和body,body 是反序列化后的 JavaObject)
RequestEntity<T>(继承自HttpEntity, 带有目标 URL 以及 HttpMethod)
ResponseEntity<T>(继承自HttpEntity, 带有响应结果的 HttpStatus)

HttpMethod(HttpMethod 枚举)
HttpStatus(HttpStatus 枚举)
HttpHeaders(Header 键值对)
MediaType
// rfcs
各种 RFC 的抽象,如SSE,Cookie,ETag

// codec
HttpMessageEncoder/HttpMessageDecoder
HttpMessage 的编码解码器,包括json/xml/cbor/protobuf 等格式的编解码接口

HttpMessageReader/HttpMessageWriter
基于编解码器构建的 R/W 接口

对 SSE/Form/Resource/Multipart 等特殊HTTP形式的支持

// converter
HttpMessageConverter<T>
将 HTTPMessage 的 Body 与特定的类型互转,比如 Resource

// client
客户端 HTTP 抽象
ClientHttpRequest(待执行的request)
ClientHttpRequestFactory(request工厂)
ClientHttpRequestInitializer(request初始化器,可以做一些通用设置,比如设置统一的 UA)
ClientHttpRequestInterceptor(request 拦截器,对 request 进行验证、修改,阻止,ClientHttpRequest -> ClientHttpResponse)
ClientHttpRequestExecution(request 执行器, 与 interceptor 结合使用,代表实际请求的执行)
// client.reactive
ClientHttpRequest 响应式的待执行 request
ClientHttpResponse  响应式的 response
ClientHttpRequestDecorator 对ClientHttpRequest 的包装,从而可以达到修改 request 的需要

ClientHttpResponseDecorator 对 ClientHttpResponseDecorator 的包装,从而可以达到修改 response 的需要

ClientHttpConnector
HTTP 客户端上的抽象,驱动底层 HTTP 客户端连接到源服务器,并提供所有必要的基础设施来发送 ClientHttpRequest 和接收 ClientHttpResponse。

// server

ServerHttpRequest
ServerHttpResponse

PathContainer
URI 路径的结构化表示形式,通过parsePath(String)解析为 and PathContainer. PathSegment 元素序列PathContainer. Separator。
每个 PathContainer. PathSegment Cookie 都以解码形式公开其内容,并删除了路径参数。这样可以安全地一次匹配一个路径段,而不会有解码的保留字符改变路径结构的风险。

RequestPath

PathContainer 的特化,它将路径细分为 a contextPath() 和其余pathWithinApplication()的 。后者通常用于应用程序内的请求映射,而前者在准备指向应用程序的外部链接时很有用。

ServletServerHttpRequest
ServletServerHttpResponse

//server.reactive
HttpHandler
// impl ContextPathCompositeHandler
反应式 HTTP 请求处理的最低级别协定,作为不同运行时的公分母。
包中org. springframework. web. server提供了应用程序(如 WebFilter、 WebSessionServerWebExchange、 和其他应用程序)的更高级别但仍然是通用的构建块。
该模块中提供了 spring-webflux 应用程序级编程模型,例如带注释的控制器和功能处理程序。
通常,an HttpHandler 表示整个应用程序,其中具有通过 org. springframework. web. server. adapter. WebHttpHandlerBuilder 桥接的更高级别的编程模型。在 ContextPathCompositeHandler的帮助下,可以插入具有唯一上下文路径的多个应用程序。

HttpHandler 根据简单的、基于前缀的映射将请求委托给多个 HttpHandler的 之一。
这旨在作为一种粗粒度的机制,用于将请求委托给多个应用程序之一 —— 每个应用程序都由一个 HttpHandler表示,应用程序“上下文路径”(基于前缀的映射)通过 ServerHttpRequest. getPath() 公开。

ServerHttpRequest
ServerHttpRequestDecorator
ServerHttpResponse
ServerHttpResponseDecorator



Remoting#


// remoting
├── remoting
│   ├── caucho
│   ├── httpinvoker
│   └── jaxws

该包包含了对一些 RPC 的封装,在 spring 6 中已被移除

Web#

web
├── accept
├── bind
│   ├── annotation
│   └── support
├── client
│   ├── async
│   ├── exceptions
│   └── support
├── context
│   ├── annotation
│   ├── request
│   │   └── async
│   └── support
├── cors
│   └── reactive
├── filter
│   └── reactive
├── jsf
│   └── el
├── method
│   ├── annotation
│   └── support
├── multipart
│   ├── commons
│   └── support
├── server
│   ├── adapter
│   ├── handler
│   ├── i18n
│   └── session
└── util
	└── pattern
// accept 包
确定请求可以返回的媒体类型
//如 Header 中指定 Accept: text/html, application/xhtml+xml
ContentNegotiationStrategy //一种用于解析请求的媒体类型的策略。
基于 'Accept' Header
固定值
基于查询参数
基于请求路径中的文件扩展名进行解析

ContentNegotiationManager
包含一批有序的Strategy,给定一个请求,返回 List<MediaType>
确定一个 MediaType 的最小范围,默认是 all

// bind 包
数据绑定功能,继承自 context/validation/databinder

对于一个web请求,其中包括各种Header,请求参数、请求体
将特定的参数,绑定到对应的变量上 Java Object

// Client 包
该包提供是对前面 http.client 抽象的一种实现,提供同步的 RestTemplate
以及一个已弃用的、基于ListenableFuture的异步 RestTemplate


//cors 
CorsProcessor
处理 cors 相关,同时有 reactive/servlet 两套不同的 Processor 抽象,只共用CorsConfiguration
剩下包括CorsConfigurationSource,CorsProcessor都不一样

// servlet only
HttpRequestHandler
此接口实质上等效于 HttpServlet,简化为中心化的处理方法。
//server 包
server 中是为 reactive 的 httpRequest/httpResponse 设计的。
因此并不适用于非 reactive 的servlet

Server包中,将 Request/Response 以及一些其他的 attribute(如WebSession),封装成 serverWebExchange

提供WebFilterChain/WebFilter 抽象,负责对 serverWebExchange 进行拦截操作

提供 WebHandler 来处理serverWebExchange,也就是具体的业务逻辑,最终写入response


//context 包
一些 spring context 的实现,对IOC 容器进行增强

//filter
包含 为servlet 以及 reactive 的filter 实现,
reactive 部分采用 server包中定义的WebFilter 为基础,实现几个基本的 webfilter
servlet 部分则以 servlet 自带的filter 抽象,实现了大量的 filter

//jsf
基于 jsf 的一些通用实现,并不实用

//method
相对来说,与 Web 没那么相关,是对 Java Method 的一种封装,提供对方法参数、方法返回值、方法注释等的便捷访问。但是又部分与 web 中的其他抽象有耦合。




Spring Web