springMVC 探索其运行流程(一)
比较想搞懂SpringMVC的依赖注入是如何实现的,而且对SpringMVC的到底是怎么样一个运行流程还没搞清楚,于是就大略的看了哈它的源码
首先是它的运行流程
在web.xml中我们这样配置
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:S.xml</param-value>
</init-param> -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
所以这个类
org.springframework.web.servlet.DispatcherServlet
就是SpringMVC的入口类,于是我从入口类开始看起,发现
public class DispatcherServlet extends FrameworkServlet
继续追踪
public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware
ApplicationContextAware这个接口就不去看了,直接忽略,继续追踪
public abstract class HttpServletBean extends HttpServlet im.......
看到了HttpServlet这个类,一般我们写自己的servlet都会继承这个类,然后重写它的doPost和doGet方法,好,找这两个方法
然后,,,,,,, 没找到, 好,难道是重写了service方法?
找service方法……………也没找到
那么,到上一级,就是在FrameworkServlet里面去找
终于发现了doGet和doPost方法,还有很多相关的doXXX方法,它们的方法体里面都只有一句话
processRequest(request, response);
好,进processRequest方法里面看哈
....
....
try {
doService(request, response);
}
catch (ServletException ex) {
failureCause = ex;
throw ex;
}catch{
.......
......
其中最重要的就是doService方法的执行,请求对象被转到这里执行.追踪进去一看
protected abstract void doService(HttpServletRequest request, HttpServletResponse response)
throws Exception;
居然是抽象方法,那么实现肯定是在DispatcherServlet类里了,在DispatcherServlet里果然找到了doService方法的实现
然后发现了这样一段代码
doDispatch(request, response);
终于找到请求分发的函数调用了,哭!!进去看一看
这里面的实现机理,我看了很大一会儿,没看怎么懂,于是连蒙带猜
HttpServletRequest processedRequest = request;
//这是,按字面意思,是责任链模式实现的??
HandlerExecutionChain mappedHandler = null;
ModelAndView mv = null;
.....
//把请求怎么特殊处理了一下??
processedRequest = checkMultipart(request);
.....
//从请求中获取链条?是controller的链条吗?
mappedHandler = getHandler(processedRequest);
.....
//字面意思是,获取处理适配器,其本质会不会是责任链的首节点的包装?
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
....
//调用处理方法,会不会在里面调用controller中指定的方法?
//controller中参数的注入难道是在这里完成的??
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
.......
//上面是对get的处理.这是对post???
mappedHandler.applyPostHandle(processedRequest, response, mv);
..........
//处理返回结果分发?恩,应该是
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
对于processDispatchResult这个方法
// Did the handler return a view to render?
render(mv, request, response);
好像最重要的就是这句话,恩,源码的注释居然加啦个问号,啥意思?
然后就是最后有一段代码不是蛮懂
if (mappedHandler != null) {
mappedHandler.triggerAfterCompletion(request, response, null);
}
//方法triggerAfterCompletion的注释是,能翻译,但不懂,囧
Trigger afterCompletion callbacks on the mapped HandlerInterceptors. Will just invoke afterCompletion for all interceptors whose preHandle invocation has successfully completed and returned true.
总之,猜测应该就是处理ModelAndView对象的,也就是把响应送回浏览器.
从上面一大堆可以看出
HandlerAdapter 这个类,和mappedHandler.getHandler()所返回的类,应该就是真正的把请求的参数什么的,注入到controller里面的最后一层了,看一下mappedHandler.getHandler()这个返回的是什么类型啊,好吧,居然是Object类型,而且HandlerAdapter还是个接口,日,,,
不可能是Object,应该绝对是有类型的,我肯定漏了某个传参的代码,并且它一定是HandlerAdapter的实现类,再找了找,,,绕晕了….
先不看它了