SpringMVC原理及流程解析

前言前端

    春节期间宅在家里闲来无事,对SpringMVC进行了比较深刻的了解,将以前模糊不清的地方基本摸索清楚了,特此撰文总结记录一下。web

正文spring

1、一个请求为何会调用到SpringMVC框架里?编程

    首先问你们一个问题,为何一个请求能进入SpringMVC的框架代码里?设计模式

    答案就是Servlet。Web容器在启动的时候会对Servlet进行初始化,对应到SpringMVC中就是将DispatcherServlet初始化,而当请求到来的时候,Web容器(如tomcat)会调用servlet的doService方法,从而进入DIspatcherServlet的处理逻辑。tomcat

    因此,SpringMVC这个轻量级Web框架,本质上是对Servlet的封装。在其中封装了大量的便捷功能,让咱们能够不用操做冗长的Servlet代码,就能便捷的开发。mvc

2、SpringMVC框架处理的流程app

    流程图网上有不少,此处我就随便找一个粘贴过来了... 下面看图说话框架

 

     请求过来以后调用Servlet的doService方法,此方法在DispatcherServlet中进行了实现,处理核心逻辑的方法是doDispatch()方法。spa

    2中是先进入处理器映射器-HandlerMapping中,获取对应的HandlerExecutionChain。HandlerMapping是什么?这要从springmvc注入Controller的方式提及,有两种,分别为:在类上加@Controller注解,这也是咱们最经常使用的;还有一种是实现Controller接口或HttpRequestHandler接口。这两种对应不一样的MappingHandler,分别为:RequestMappingHandlerMapping、BeanNameUrlHandlerMapping。因此第二步就是分别调一下这两个handlerMapping,看看哪一个能匹配处处理请求的MethodHandler,能匹配到就将MethodHandler封装成HandlerExecutionChain返回。

    3是匹配处理器适配,从2中拿到MethodHandler执行体以后,在3中匹配对应的HandlerAdapter。此处用了策略的设计模式,HandlerAdapter接口中的support方法负责判断是不是由当前扩展类处理,handle方法对当前请求进行处理。有三个实现类,分别为RequestMappingHandlerAdapter、HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter。默认是RequestMappingHandlerAdapter。

    4是获得处理器适配器后,调用其handle方法将请求转到对具体目标方法的调用。不一样的实现类在调用handle方法时用不一样的方式组装方法参数、调用方法。好比RequestMappingHandlerAdapter的handle方法经过反射调用到目标方法,而实现Controller接口的会直接调用接口方法。调用完以后获得ModelAndView。

    5是经过ViewResolver对ModelAndView进行解析,获得视图后给前端渲染。

     因此看下来,SpringMVC的重点其实就是2/3/4这三步。

3、SpringMVC框架的扩展点

    首先HandlerMapping能够扩展,实现接口并放入handlerMappings集合中便可。可是这须要对现有框架作较大改动,由于Controller中的方法也要放入这个HandlerMapping实现类中,因此通常只有框架做者才会作此类扩展。

    其次HandlerAdapter能够扩展,一样实现接口并放入handlerAdapters集合中便可。

    最后经过实现接口 org.springframework.web.servlet.config.annotation.WebMvcConfigurer重写其中的方法,往里添加ViewResolver、ArgumentResolver等类来实现对视图的解析、对参数的解析。

    经过上面能够看到,一个好的框架是如何经过面向接口编程来预留扩展点的。 

4、总结

     一个好的框架,核心思路以及流程可能并不复杂,可是当尽量多的增长上扩展点、填充上针对各类场景的处理逻辑后,就会显得总体繁杂,使得新人刚看一个框架源码是不明就里,而当你能透过这繁杂的表象看清其精简的核心时,你也就理解了设计者的思想。

    本文主要给本身查漏补缺用,写的深一脚浅一脚,若有有异议的地方还请指正!

相关文章
相关标签/搜索