Spring boot 2.4.0 类型 HandlerInterceptorAdapter 已弃用

作者:编程家 分类: spring 时间:2025-09-23

标题:Spring Boot 2.4.0中HandlerInterceptorAdapter的弃用及替代方案

在最新的Spring Boot版本2.4.0中,我们注意到了一个重要的变化:类型HandlerInterceptorAdapter已经被弃用。本文将介绍这一变化的原因,并提供一种替代方案。同时,我们还将通过一个案例代码来演示如何使用新的替代方案。

## 弃用HandlerInterceptorAdapter的原因

在过去的Spring Boot版本中,我们经常使用HandlerInterceptorAdapter类来实现自定义的拦截器。然而,在2.4.0版本中,Spring团队决定将HandlerInterceptorAdapter类标记为弃用。这是因为HandlerInterceptorAdapter类是基于继承的方式来实现拦截器功能,而继承本质上是一种紧耦合的关系。这种紧耦合的关系在某些情况下可能会导致一些问题,例如无法同时使用多个拦截器链。

为了解决这些问题,Spring Boot引入了一种更灵活的方式来实现拦截器功能,即使用接口来定义拦截器。这种方式可以更好地支持组合多个拦截器,并且提供了更好的灵活性和可扩展性。

## 新的替代方案:HandlerInterceptor接口

在Spring Boot 2.4.0中,我们可以使用HandlerInterceptor接口来替代HandlerInterceptorAdapter类。该接口定义了三个方法,分别是preHandle、postHandle和afterCompletion。我们可以根据需要实现这些方法来实现自定义的拦截器逻辑。

下面是一个示例代码,演示如何使用HandlerInterceptor接口来实现一个简单的请求计时拦截器:

java

public class TimingInterceptor implements HandlerInterceptor {

private static final Logger logger = LoggerFactory.getLogger(TimingInterceptor.class);

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

long startTime = System.currentTimeMillis();

request.setAttribute("startTime", startTime);

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

long startTime = (Long) request.getAttribute("startTime");

long endTime = System.currentTimeMillis();

long executeTime = endTime - startTime;

logger.info("Request URL: " + request.getRequestURL().toString() + " | Execution Time: " + executeTime + "ms");

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

// 在请求完成后进行一些清理工作

}

}

在上述代码中,我们定义了一个TimingInterceptor类,实现了HandlerInterceptor接口。在preHandle方法中,我们记录了请求的开始时间,并将其保存在HttpServletRequest的属性中。在postHandle方法中,我们计算了请求的执行时间,并将其打印出来。在afterCompletion方法中,我们可以进行一些清理工作,例如资源释放等。

##

通过本文,我们了解了在Spring Boot 2.4.0中弃用HandlerInterceptorAdapter类的原因,并介绍了新的替代方案HandlerInterceptor接口。我们还通过一个简单的案例代码演示了如何使用HandlerInterceptor接口来实现自定义的拦截器逻辑。这种方式可以更好地支持多个拦截器的组合,并提供更好的灵活性和可扩展性。因此,在升级到Spring Boot 2.4.0及以上版本时,我们应该采用新的替代方案来实现拦截器功能。