介绍
Spring有两种拦截器提供给我们使用,一种是HandlerInterceptor,另一种是MethodInterceptor。这两种的来源不同,实现方式也不同,具体的下面来看一下。
HandlerInterceptor
来源
来源于spring-webmvc包
HandlerInterceptor拦截的是请求,是springMVC项目中的拦截器,它拦截的目标是请求的地址
实现原理
首先要明确,HandlerInterceptor并没有使用反射或者代理来实现,它的实现类似于Servlet的Filter,使用了责任链模式来将多个拦截器组成一个链条,每个拦截器都有机会对请求进行处理,并决定是否继续传递给下一个拦截器。这样可以实现灵活的拦截逻辑,也方便拦截器的复用和扩展。
HandlerInterceptor
是在请求到达处理器方法之前和之后执行的。它是通过HandlerMapping
来映射处理器方法和拦截器的。HandlerMapping
是一个接口,它有多个实现类,比如RequestMappingHandlerMapping
、BeanNameUrlHandlerMapping
等。当程序启动的时候,Spring会扫描所有的处理器方法和拦截器,并将它们注册到对应的HandlerMapping
中。当请求到达DispatcherServlet
时,它会调用HandlerMapping
来获取匹配的处理器方法和拦截器,并按照顺序执行拦截器的preHandle
方法、处理器方法、postHandle
方法和afterCompletion
方法。
我们编写的拦截器,就在RequestMappingHandlerMapping
的interceptors
中
过程
我们编写的拦截器,在程序启动时,就会被加载到RequestMappingHandlerMapping
的interceptors
中,这个interceptors
其实存在在RequestMappingHandlerMapping
的父类AbstractHandlerMapping
中
代码
这块儿我另开一篇,回头把链接更新过来。
MethodInterceptor
来源
来源于spring-aop包,MethodInterceptor是AOP项目中的拦截器,它拦截的目标是方法,而不是请求。它可以在方法执行前后添加额外的逻辑
实现原理
从它的来源来看,它的确使用了反射和动态代理的技术。