springMVC 探索其运行流程(一)

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的实现类,再找了找,,,绕晕了….

先不看它了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值