学了这么久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(适配),就可以做很多代理操作强化方法