Spring Interceptor的执行顺序是按照它们在Spring配置文件中注册的顺序来的。具体来说:
-
当一个请求到来时,Interceptor的
preHandle
方法会按照注册的顺序依次被执行。如果所有Interceptor的preHandle
方法都返回了true
,则请求会继续被处理;如果其中有任何一个Interceptor的preHandle
方法返回了false
,则请求处理立即终止,后续的Interceptor以及实际的请求处理方法都不会被执行。 -
请求处理完毕后,Interceptor的
postHandle
和afterCompletion
方法将会被执行,但这两个方法的执行顺序是与注册顺序恰恰相反的。也就是说,先注册的Interceptor的这两个方法会后执行,后注册的Interceptor的这两个方法会先执行。
这种设计允许我们在Interceptor中实现一些类似于前置检查和后置处理的功能,同时也需要我们注意控制Interceptor的注册顺序以保证其正确执行。
以下是注册多个Interceptor的一个例子:
@Configuration
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {
@Autowired
FirstInterceptor firstInterceptor;
@Autowired
SecondInterceptor secondInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(firstInterceptor).addPathPatterns("/api/*");
registry.addInterceptor(secondInterceptor).addPathPatterns("/api/*");
}
}
在这个例子中,FirstInterceptor
中的preHandle
方法会在SecondInterceptor
之前执行,而postHandle
方法和afterCompletion
方法则在SecondInterceptor
之后执行。