Spring MVC源码浅析

学了这么久java了,之前一直是在学习,学而不思则罔。
计划要有一些自己的产出,在CSDN学到了不少,也应该做出一点自己的贡献,不说太多,开写,如果有大佬路过,望大佬指正。

首先,先把类图挂起来
在这里插入图片描述
最重要的肯定是这个DispatchServlet
根据最前做servlet经验:我们一般会有一个url,然后配一个servlet来处理,然后比较高级的做法就会做一层类似反向代理的操作,有一个Servlet里面维护了url和我们的处理的映射关系,然后根据url匹配到处理类。

Spring应该也是这么处理的可以看DispatchServlet的一个关键方法:
在这里插入图片描述
是不是很熟悉,doService方法
下面主要是就是调用我们的doDispatch方法

try {
    this.doDispatch(request, response);
} finally {
    if (!WebAsyncUtils.getAsyncManager(request).isConcurrentHandlingStarted() && attributesSnapshot != null) {
        this.restoreAttributesAfterInclude(request, attributesSnapshot);
    }

}

期间做一些request的setAttribute,

在这里插入图片描述
看重头戏:
关键代码

  mappedHandler = this.getHandler(processedRequest);

这个方法内部就是
private List handlerMappings;

先小结一下刚刚的过程,我们对预处理的request进行一个匹配找到handler(我们的业务类)

好了我们在想,那么这个list是怎么来的呢
我们先想一想spring架构,spring mvc作为一个扩展,要可以运行肯定是有spring依赖的,那么我们是不是可以拿到beanFactory,是不是可以拿到我们注解的类,或者配置的类。果然看Dispatch类的一个初始化方法

在这里插入图片描述
会在beanFactory里面拿到我们想要的类。
从而整个流程就跑通了

请求->{doService->doDispatch->匹配Mapping(init会初始化) (全程在DispatchServlet里面)}。

那么我们的一些额外功能在哪里实现的呢。

在这里插入图片描述
在这个方法里面如一些异常处理类,请求体的文件解析
会在之前处理完。类似于AOP的操作

但是Spring还做了一个非常nice的工作,之前我说的那种模型是不是要自己匹配一个类,很可能这个过程要我们利用反射类校对这个handler是不是满足处理请求的条件(如参数配置等)
在这里插入图片描述
HandlerAdapter这个类对请求做适配,根据url匹配的Hanler,然后在根据请求做适配,改成目标方法可以使用的样子。这样使用起来是不是就很方便了,具体里面怎么适配的我猜可能是一个代理手段,反射手段,这里如果有大佬路过欢迎指教。

小结:相对于原来的Servlet开发,MVC到底便利在哪里
1,自动参数注入(请求封装)
2,url匹配到方法(请求分发)
3,结果解析(model and view的渲染方法按照需求可以对响应结果做一次AOP,返回到Dispatch后也会在处理)
4,其他强化处理,如:异常处理,请求体解析,对我们的业务方法做了Apater(适配),就可以做很多代理操作强化方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值