SpringMVC源代码学习外传(三)RequestCondition

以下内容基于书:《看透SpringMVC-源代码分析与实践》
基本照搬。。。用于自己查阅备忘。加上外传关键字的是讨论一些SpringMVC的特定类的使用方法,非外传的是对启动流程/请求处理流程,我们可以看作主线剧情。

RequestCondition是一个springMVC的接口,专门用于保存从request提取出的用于匹配handler的条件。
它的继承树如下:

RequestCondition继承树

代码如下:

public interface RequestCondition<T> {
    T combine(T other);
    T getMatchingCondition(HttpServletRequest request);
    int compareTo(T other, HttpServletRequest request);
}

可以看到它的抽象实现,AbstractRequestCondition有8个子类,下面介绍下他们

CompositeRequestCondition

它本身不实际做匹配,而是可以存储多个RequestCondition,用的时候遍历它存储的这些RequestCondition进行匹配即可,也就是责任链模式,这种模式在SpringMVC中很常见,类名是CompositeXXX或者XXXComposite的就是。部分代码如下:

private final RequestConditionHolder[] requestConditions;
@Override
public CompositeRequestCondition getMatchingCondition(HttpServletRequest request) {
    if (isEmpty()) {
        return this;
    }
    RequestConditionHolder[] matchingConditions = new RequestConditionHolder[getLength()];
    for (int i = 0; i < getLength(); i++) {
        matchingConditions[i] = this.requestConditions[i].getMatchingCondition(request);
        if (matchingConditions[i] == null) {
            return null;
        }
    }
    return new CompositeRequestCondition(matchingConditions);
}

AbstractRequestCondition的其他子类

每个子类表示一种匹配条件,如,PatternsRequestCondition使用url匹配。
RequestMethodsRequestCondition使用RequestMethod做匹配。

RequestMappingInfo

我们在介绍AbstractHandlerMethodMapping1时提到它的泛型默认实现是RequestMappingInfo,
它的内部用七个变量保存了七个RequestCondition,匹配时用他们进行匹配,这也就是@RequestMapping中可以给处理器指定多种匹配方式的原因。

private final PatternsRequestCondition patternsCondition;
private final RequestMethodsRequestCondition methodsCondition;
private final ParamsRequestCondition paramsCondition;
private final HeadersRequestCondition headersCondition;
private final ConsumesRequestCondition consumesCondition;
private final ProducesRequestCondition producesCondition;
private final RequestConditionHolder customConditionHolder;

应用实例

先留空以后写代码测试补上


  1. http://blog.csdn.net/xia4820723/article/details/51418676 SpringMVC源代码学习(四)九大组件上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值