spring疑点

12次阅读

共计 1872 个字符,预计需要花费 5 分钟才能阅读完成。

过滤器与拦截器

流程

http 容器 -> 过滤器 ->servlet-> 拦截器 ->controller 方法 -> 拦截器 ->servlet-> 过滤器 ->http 容器。这是一个请求的回路,有进有出。

过滤器

javax.servlet.Filter

1、由 Servlet 规范定义
2、不可以获得 spring 内部 bean

拦截器

 类定义:org.springframework.web.servlet.HandlerInterceptor

1、spring web 内部定义
2、可以获得 spring 内部 bean

拦截器接口定义的方法

 方法都有这三个参数:HttpServletRequest request, HttpServletResponse response, Object handler

1、preHandle 
2、postHandle
    有一个 ModelAndView modelAndView 参数
    执行时间:DispatcherServlet 渲染 view 之前
3、afterCompletion
    另外有一个 Exception ex 参数
    执行时间:在请求处理完成,渲染完 view 之后
    作用:可以清理资源,处理异常 

handler 参数的类型

 除了 HandlerMethod 还有 

HandlerMethod

org.springframework.web.method.HandlerMethod
保持最终被执行方法的 pojo,spring web 中指 Controller 中处理请求的方法。成员变量.
bean

HandlerMapping 与 HandlerAdapter

DispatcherServlet 加载所有的 HandlerMapping 实例,所有 HandlerAdapter 实例。请求过来的时候,从所有 HandlerMapping 实例中找到当前请求的 Handler(如果框架使用的是 RequestMappingHandlerMapping,得到的 handler 实例就是 HandlerMethod),然后把 handler 封装成 HandlerExecutionChain,然后在所有 HandlerAdapter 实例中获得可以支持该 handler 的 HandlerAdapter(每个实例都有支持的 handler 的判断,框架默认的 adapter 是 RequestMappingHandlerAdapter),拿到了 hander 和 adapter 就可以执行具体的业务了。

HandlerMapping

org.springframework.web.servlet.HandlerMapping
此接口只定义一个方法:为了找到请求的执行程序。如果已有的 HandlerMappign 实现中没有能够满足你所需要的规则时,可以通过实现 HandlerMapping 接口进行扩展 

方法

HandlerExecutionChain getHandler(HttpServletRequest request) 返回此请求的处理程序和所有拦截器。

HandlerExecutionChain

 类定义:org.springframework.web.servlet.HandlerExecutionChain
处理者和执行链路封装:包含 Handler 和一些 HandlerInterceptor 实例。

如何确定当前框架使用哪个 HandlerMapping

?

HandlerAdapter

org.springframework.web.servlet.HandlerAdapter
该适配器使调用方与具体程序的执行解耦。可以支持调用 Object 类型的执行程序,可以与其它框架融合。

方法

 该 adapter 是否支持该 handler 实例
boolean supports(Object handler)

具体的处理业务逻辑。使用 hadnler 处理 request。ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) 

Handler

 是一个抽象概念。经常用到的是 HandlerMethod

HandlerMethod

org.springframework.web.method.HandlerMethod

注解

组合注解

AnnotationUtils 和 AnnotatedElementUtils

AliasFor 注解

参考


spring boot 过滤器、拦截器的区别与使用

Spring 注解(一)Spring 注解编程模型

Spring MVC HandlerMapping HandlerAdapter

正文完
 0