3.1 基于请求信息的条件映射
SpringMVC 为请求的处理器提供的声明式注解的方式,用于根据请求信息把请求映射到处理器方法上。要想使类中标记了@RequestMapping 注解的方法可以被作为请求的处理器使用,还需要声明此类为被 Spring 管理的 Bean, 则称这种 Bean为控制器类。一般来说控制器类使用@ Controller 注解来声明。当然具体的查找依据是 Bean 的类型上是否标记了注解@Controller或者@RequestMapping。
3.1.1 请求信息与条件概述
对于 HTTP 请求来说,请求中可以包含多种信息, 包括请求路径、请求方法、请求参数、请求头等信息,而请求头中又包括几个通用的信息, 例如请求体类型 Content- Type和可接收的返回类型 Accept,可以通过 Chrome 的开发者工具查看 HTTP 请求的信息。
在@RequestMapping 注解中提供了多个属性。每个属性都作为一种判断条件, 对应于HTTP 请求中的一个信息。当请求通过DispatcherServlet 进行分发时,与该注解相关的处理器查找类 RequestMappingHandlerMapping 负责遍历所有@RequestMapping 注解的信息, 根据请求信息查找到与注解中配置的条件属性匹配度最高的注解,该注解所标记的方法就是最终被选择的处理器方法。
注解@RequestMapping 既可以标记在方法上, 也可以标记在类上。当标记在类上时,在扫描到该类中的方法标记有@RequestMapping注解时,会把方法上的@RequestMapping 注解信息与类上的@RequestMapping信息进行合并, 也即对两个注解中的条件进行合并, 每种条件都有不同的合并规则。
@RequestMapping中的每个属性都具有一些相同的行为,但是这些行为在不同的属性中表现不同,这就类似于抽象了接口与实现一样。每个条件都是 RequestCondition 接口的一种实现, 每个属性均有以下特性类型。
匹配规则: 与请求的匹配逻辑。
多值匹配规则: 属性数组提供多个值时匹配逻辑, 与和或的关系。
合并规则: 方法与类型上的属性合并规则。
排序规则: 当该请求有多个注解中的属性与之匹配时, 对匹配结果的排序规则。
所有属性共有的特性为: 当注解中属性未提供值时, 表明不对此条件进行过滤, 即任意请求均匹配此属性的条件。而多值匹配则按照与和或的关系执行逻辑, 通过匹配规则获取匹配结果时,会包含满足请求条件的属性列表, 属性数组中与请求不满足匹配关系的值不会放入此列表, 该列表可以作为后续的排序依据。
排序规则总是按照条件的特殊性来进行的,即条件越特殊, 排序越靠前, 当然对于未提供属性值时导致的任意请求均视为匹配, 这种全匹配肯定是排序最靠后的。