SpringMvc适配器与请求分发

我们知道使用spring框架的时候,每个请求都是通过springmvc的请求分发器进行分发的,下面主要探究一下这个分发的过程

下面这张图是SpringMVC的工作流程图

我们主要关注第2步到第7步的部分,下面配合代码进行解析

mvc采用了适配器设计模式,目的是为了更好的拓展,因为我们知道每个请求实际上是对应一个controller的方法;如果我们写一个方法,分发器就要写一个逻辑去判断什么样的请求可以执行这个方法,那么这个框架就失去了通用性,所以springmvc采取了适配器设计模式来设计请求分发

适配器

下面简单介绍下springmvc适配器相关的知识

我们知道,适配器是对接口的一种转换,使得不同的接口可以被客户端的同一个接口类型变量调用,其中就要通过适配器进行一个转换

springmvc中有一个适配器叫RequestMappingHandlerAdapter,现在我们的请求几乎都是通过这个适配器转换的,当然还有其他适配器,所有适配器都要实现一个共同适配器接口HandlerAdapter,分发器也是通过这个接口里的handle方法进行实际方法的调用

执行流程

我们以最常见的RequestMappingHandlerAdapter适配器来讲解,下面匹配的适配器都是他

下面来看下分发执行的流程,从一个请求开始

我写了个controller,里面有个匹配路径为/test1的方法用于测试,启动我们的服务,然后发送一个请求

可以发现请求进入了我们预先设置了断点的位置,这个就是我们分发请求的地方,所有请求都会调用这个方法,下面我们来看下里面每行代码的作用

前面这段代码实际上就是做一些准备工作,我们可以略过

这个方法是我们的重点之一,他会通过我们传入的request对象得到一个处理链(这个处理链包括我们的处理器以及拦截链条),我们进入这个方法看下

可以看到他会逐一进行匹配,直到找到符合条件的处理链,我们看下几个属性

这个是我们遍历的集合,他里面记载的我们等下用于匹配的对象,每个mapping都有个getHandler方法,如果这个请求跟我是匹配的,他就会返回一个对象,否则为null,现在我们看下他究竟返回的是什么

可以看到这个方法第一步就是去获取处理器,其实处理器就是一个Object对象,因为不同的适配器他handler的逻辑不一样,所以如果每个适配器对应的处理器对象都是固定的,很难去做一个拓展(而且适配器调用handler方法的时候会对处理器做一个强转,强转成自己定义的类型,这也说明不同适配器的处理器对象是不同的)

我们再进去看看他是如何获取处理器的

可以看到此时mvc已经解析出我们的请求路径是"/test1"了,将解析出来的路径传入lookupHandlerMethod这个方法,该方法最后返回了一个HandlerMethod对象,具体如何返回我没有进行深究,但是可以看到

在这一步,我们的mvc终于确定你这个方法是来自TestController的,应该是通过反射得到的(猜测)

这个就是此时(注意是此时)handlerMethod的各个属性,可以看到里面的确有个method对象,这也是后续执行方法要用到的,但是注意,此时的bean是个字符串,也就是还有没找到我们TestController这个Bean对象,所以下一步自然就是去我们的bean工厂寻找了(因为beanFactory我们也已经有了),相当于此时我们是拿到了映射关系(比如我们把controller命名为aaa,就会得到如下)

handlerMethod.createWithResolvedBean()方法就是要得到我们真正的bean,并且依然是封装为handlerMethod这个对象,然后返回

得到了handler,我们就可以封装为处理器链了,处理器链里就是我们一开始定义的拦截器,根据其设置的匹配路径,判断是否要将处理器放入链条

然后将其返回即可(如果得不到或不满足情况,就会返回null,然后再匹配下一个mapping)

又回到了这里,我们现在得到了处理器链,然后就可以根据这个处理器去获取对应的适配器

可以看到我这里的适配器就是RequestMappingHandlerAdapter,然后就进行处理

可以看到官方注释写了,这里才是真正执行的地方,然后返回mv,给视图解析器解析即可

总结

一个请求过来,先通过mapping匹配,找到对应的处理器链,然后通过这个处理器链里的处理器类型,找到对应的适配器,然后用适配器去执行(执行逻辑就看自己写的是什么样了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值