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 中的其他抽象有耦合。