SpringMVC拦截器(HandlerInterceptor)

首先看看spring-mvc.xml中springMVC拦截器的配置


以上的拦截器的配置对所有的请求映射都进行拦截。下面我们来看看springmvc的解析过程,通过InterceptorsBeanDefinitionParser解析:

我们知道springMVC处理请求会获取HandlerExecutionChain,在HandlerExecutionChain中会有获取到的HandlerInterceptor,下面来看看关键代码,在AbstractHandlerMapping抽象类中:

下面来看看adaptedInterceptors是什么鬼,怎么初始化的?
    1、adaptedInterceptors是AbstractHandlerMapping这个抽象类的属性
   
    2、它的初始化是在相同类的initApplicationContext()方法中,这个方法会在springIoC容器启动时调用,具体调用逻辑读者自行查看源码,此处不赘诉:
   
    3、下面看看detectMappedInterceptors方法:
   
    上面的代码我们可以看到通过BeanFactoryUtils来获取是MappedInterceptor类型的拦截器。
    4、跟踪代码可以知道最终获取MappedInterceptor的地方是DefaultListableBeanFactory的doGetBeanNamesForType方法
   
   
    通过上面的介绍其实我们就知道了beanDefinitionNames中的拦截器bean是InterceptorsBeanDefinitionParser解析完了之后注册到beanDefinitionNames中的。现在我们已经彻底明白了
    springMVC初始化和调用的过程了,至于springMVC中的拦截器如何执行以及执行过程,请读者自行查看源码,很简单,不难。
PS:springMVC自己注册的MappedInterceptor分别是ResourceUrlProviderExposingInterceptor和ConversionServiceExposingInterceptor
至于是何时初始化的和各自有什么用,有兴趣的同学可以研究一下。笔者可以透露一下,它们都是通过mvc标签进行初始化的。本文基于spring4.2.0。
posted @ 2016-05-06 16:12  gkaigk  阅读(269)  评论(0编辑  收藏  举报