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的要害组件性能进行介绍,后续文章会对各个要害组件的源码进行解析。
本文最先公布至微信公众号,版权所有,禁止转载!