小程序三方平台开发: 解析小程序开发的未来趋势和机遇
659
2022-10-23
SpringMVC源码解析-doDispatch方法
断点入口
容器启动后,我们根据URL访问接口,我们的DispatcherServlet都做了什么操作呢?
我们可以在DispatcherServlet类中的doDispatch方法中打断点来详细查看;
为什么直接在doDispatch方法中打断点?
由图可知DispatcherServlet继承自HttpServlet抽象类,我们的get/post请求分别会请求其doGet和doPost方法;
DispatcherServlet的父类FrameworkServlet中对doGet和doPost方法进行了重写,都会执行this.processRequest(request, response);
protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.processRequest(request, response); } protected final void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.processRequest(request, response); }
processRequest方法会执行方法:this.doService(request, response);而FrameworkServlet中的doService是抽象的,具体实现方法是在DispatcherServlet中;
protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws Exception;
而DispatcherServlet中的doService则执行了关键方法:this.doDispatch(request, response)。
所以我们执行把断点打在此方法处,看DispatcherServlet具体都做了什么操作。
doDispatch方法
前言:除了新建一个类使用@Controller注解,还有什么方法能够新建一个Controller呢?实现Controller接口或者是实现HttpRequestHandler接口也是可以做到的,重写其handleRequest方法,不要忘记使用Component("/URI")注解哦。
执行doDispatch,直接看主要方法 :getHandler
Spring是通过HandlerMapping对象来查找Handler(就是Controller)的,通过不同的HandlerMapping实现来查找不同方式创建的Controller;
通过断点可以看到默认会有两个HandlerMapping的实现:RequestMappingHandlerMapping和BeanNameUrlHandlerMapping;
所有加了@Controller的Controller对象会放在RequestMappingHandlerMapping的父类AbstractHandlerMethodMapping的内部类MappingRegistry的一个Map属性中去,
而所以以BeanName形式定义的Controller对象会放在BeanNameUrlHandlerMapping的父类AbstractUrlHandlerMapping的Map属性中去。
class MappingRegistry { private final MultiValueMap
public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping implements MatchableHandlerMapping { private final Map
通过HandlerMapping .getHandler(request)方法返回一个封装了Handler的HandlerExecutionChain对象并返回;
接着执行getHandlerAdapter方法,通过Handler获取其对应的HandlerAdapter适配器;
HandlerAdapter也同样有多个实现,依据不同的Handler,通过supports方法判断该Handler是哪个类的实现,来返回不同的适配器实现;
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { if (this.handlerAdapters != null) { Iterator var2 = this.handlerAdapters.iterator(); while(var2.hasNext()) { HandlerAdapter adapter = (HandlerAdapter)var2.next(); if (adapter.supports(handler)) { return adapter; } } } throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler"); }
接着会执行HandlerAdapter.handle方法,将根据适配器调用Controller的具体业务,不同的适配器处理对应的handle处理方式各不相同;
最后返回ModelAndView对象。
流程概览图
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~