SpringMVC的工作原理作为面试常问的问题,个人认为还是非常有必要弄清楚的
1、原理图
SpringMVC的工作原理分为11个步骤,1.首先用户发送请求到前端控制器DispatcherServlet,2.前端控制器DispatcherServle收到请求后调用HandlerMapper处理器映射器,3.处理器映射器找到具体的处理器后生成处理器对象以及处理器拦截器(如果有的话)一并返回给前端控制器DispatcherServle,4.前端控制器调用处理器适配器HadnlerAdtapter,5.处理器适配器经过适配调用具体的处理器(controller,后台控制器),6.controller执行完成后返回ModelAndView,7.处理器适配器HadnlerAdtapter将ModelAndView返回给前端处理器DispatcherServle,8.前端控制器DispatcherServle将ModelAndView传给视图解析器ViewResolver,9.视图解析器解析后返回具体的View给前端控制器,10,前端控制器DispatcherServle根据view进行渲染,11.最后响应给用户。
源码分析
DispatcherServlet类
DispatcherServlet类中initStrategies初始化的策略,它这里面把我们所定义的映射器、适配器、视图解析器都初始化了
DispatcherServlet类中的static静态代码块,在类被加载的时候去处理,ClassPathResource获取DisptatcherServlet的类路径,PropertiesLoaderUtils.loadProperties(resource)加载我们的属性文件,
DEFAULT_STRATEGIES_PATH默认策略的路径,
那么在DispatcherServlet类被加载的时候,ClassPathResource会去类路径里面去找到DisptatcherServlet,然后把DispatcherServlet.prpperties里面的信息给加载到private static final Properties defaultStrategies里面,然后init初始化的时候就会从这里面读取信息
DEFAULT_STRATEGIES_PATH默认策略的路径就是DispatcherServlet.prpperties
然后看一下DispatcherServlet所继承的父类FrameWorkServlet中的contextConfigLocation这个就是我们在web.xml中配置的,它是一个成员变量
web.xml中的contextConfigLocation
配置文件DispatcherServlet.properties文件中的HandlerMapping提供了两个映射器,第一个就是根据javaBean的名称和url作为映射,第二个就是通过注解的方式作为映射,后面常用的也是第二个
配置文件DispatcherServlet.properties文件中的HandlerAdapter提供了三个映射器,第一个基于HTTP请求的适配器,第二个是一个简单的适配器,第三个基于注解方法的处理器适配器,用注解的时候会用第三个适配器,因为基于注解的HandlerMapping有多个,所以需要专门把AnnotationMethodHandlerAdapter配置出来
配置文件DispatcherServlet.properties文件中的ViewResolver视图解析器只有一个,所以不用去配,会自动加载
实际上在程序开发中DispatcherServlet、HandlerMaaping、HandlerAdapter、ViewResolver都不需要我们去写,清楚SpringMVC的处理流程以及稍微了解源码即可,主要还是写Controller