乐趣区

关于java:SpringMVC-解析一概览

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 都会失效。

@Controller
public class SimpleController {

    // ...

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

总结

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

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

退出移动版