Spring MVC是Spring提供的构建Web应用程序的框架,该框架遵循了Servlet标准,负责接管并解决Servelt容器传递的申请,并将响应写回Response。Spring MVC以DispatcherServlet为外围,泛滥组件如HandlerMapping为辅助,为用户封装了申请映射等底层逻辑,让用户能够更专一与业务逻辑的解决。本文会对Spring MVC整体构造做简略介绍。

Spring MVC结构图

Spring MVC是一个基于Servlet容器的Web利用框架,这里的Servlet容器通常指Tomcat等服务容器。Servlet容器会负责监听端口音讯并映射为Request/Response对象,而后交给Servlet实例去解决。SpringMVC框架的作用外围就是Servlet实例,这个实例在Spring中默认是DispatcherServlet,DispatcherServlet中应用泛滥Spring组件来帮助解决申请,其结构图如下所示。

Servlet容器

Servlet用于从某个Socket接收数据,并解决为规范的ServletRequest和ServletResponse。其外部逻辑比较复杂,我在对于Tomcat容器的其它系列文章中有具体的介绍Tomcat的构造,此处只简略列举一下其性能:

  • 接管socket申请,能够是同步或者异步,阻塞或非阻塞等形式。
  • 解决申请中的协定,如Http协定等。
  • 路由申请到对应的servelt实例。

外围组件DispatcherServlet

Spring MVC的外围组件就是DispatcherServlet,它是SpringWeb申请的调度核心,它的次要性能如下所示:

  • 在Spring容器启动阶段读取映射规定,如RequestMapping;
  • 在申请到来的时候,依照加载的申请映射规定找到适合的解决办法;
  • 当解决申请的过程中呈现了异样,对异样进行解决,如返回适合的界面或状态码;
  • 解析返回View的主题、时区等信息;
  • 渲染返回的视图。

申请映射HandlerMapping

申请映射用于依据申请找到该申请须要调用的所有办法,蕴含过滤器和解决办法等。比拟罕用的一种申请映射是RequestMappingHandlerMapping,从名称上能够看进去这个HandlerMapping是用于解决@RequestMapping注解申请映射的类。该类的工作原理如下所示,能够看到该类的次要作用是在收到申请之后,按程序拿到所有须要调用的办法(次要蕴含拦截器和解决办法),而后一一调用这些办法。

拦截器HandlerInterceptor

拦截器和Tomcat容器中的Valve有些相似,Spring的拦截器能够让用户灵便的在申请解决前、申请解决后和申请实现三个阶段自定义操作,比方用户权限校验等。拦截器的作用咱们能够在上一节的图中看到,Spring对于拦截器的接口定义如下所示:

public interface HandlerInterceptor {    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        return true;    }    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,            @Nullable ModelAndView modelAndView) throws Exception {    }    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,            @Nullable Exception ex) throws Exception {    }}

解决办法Handler

解决办法在DispatcherServlet定义为Object类型,如果咱们应用了@RequestMapping来依据申请查找解决办法,那么查找到的解决办法就是HandlerMethod类型,对应于Controller中增加了对应RequestMapping的办法。

解决办法适配器HandlerAdapter

DispatcherServlet从HandlerMapping中获取到的解决办法是Object类型,意味着不同的解决办法可能返回不同的对象,DispatcherServlet自身是一个调度器,不应该关注如何调用不同的解决办法,所以Spring提供了HandlerAdapter列表用户解决不同的调度办法。

// 解决办法适配器接口定义public interface HandlerAdapter {    boolean supports(Object handler);    @Nullable    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;    long getLastModified(HttpServletRequest request, Object handler);}

异样解决HandlerExceptionResolver

HandlerExceptionResolver用于解决申请过程中呈现的异样,其实现有很多中类型,不过咱们日常开发中应用比拟多的是ExceptionHandlerExceptionResolver,也就是解决咱们定义的@ExceptionHandler注解。典型的@ExceptionHander的应用形式如下所示,@ExceptionHander还能够放在@ControllerAdvice注解的类中,示意对所有的Controller都会失效。

@Controllerpublic class SimpleController {    // ...    @ExceptionHandler    public ResponseEntity<String> handle(IOException ex) {        // ...    }}

总结

本文只是简略的对SpingMVC的要害组件性能进行介绍,后续文章会对各个要害组件的源码进行解析。

本文最先公布至微信公众号,版权所有,禁止转载!