拦截器(Interceptor)生命周期 取决于具体技术栈,不同框架中含义不同。下面区分几种最常见的场景说明:
HandlerInterceptor)生命周期Spring MVC 的拦截器不是单例随容器启动就结束,而是围绕一次 HTTP 请求存在。
public class MyInterceptor implements HandlerInterceptor {
public MyInterceptor() {
System.out.println("拦截器被创建");
}
}
✅ 生命周期起点:Spring 容器启动
一个 HTTP 请求会依次触发拦截器的方法:
preHandle → Controller → postHandle → afterCompletion
| 方法 | 执行时机 | 是否可中断 |
|---|---|---|
preHandle |
Controller 执行前 | ✅ 返回 false 可中断 |
postHandle |
Controller 执行后,视图渲染前 | ❌ |
afterCompletion |
整个请求完成后(包括视图渲染) | ❌ |
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("afterCompletion");
}
容器启动 → 创建拦截器(单例)
↓
每次请求 → preHandle → Controller → postHandle → afterCompletion
↓
容器关闭 → 销毁拦截器
Interceptor)生命周期MyBatis 拦截器生命周期与 SqlSessionFactory 绑定。
@Intercepts({@Signature(type = StatementHandler.class,
method = "prepare",
args = {Connection.class, Integer.class})})
public class MyBatisInterceptor implements Interceptor {
}
MyBatis 初始化 → 创建拦截器
↓
每次 SQL 执行 → 拦截器生效
↓
应用关闭 → 销毁
| 框架 | 生命周期范围 | 是否单例 |
|---|---|---|
| Spring MVC | 容器级 | ✅ |
| MyBatis | SqlSessionFactory 级 | ✅ |
| Struts2 | 请求级 | ❌ |
| OKHttp | 应用级 | ✅ |
如果你指的是 某一个具体框架(如 Spring Boot / MyBatis / Vue / Axios),告诉我,我可以精确到源码级别解释。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。