当前位置: 首页 > news >正文

SpringBoot--Spring MVC 拦截器注入与 new 的区别

1️⃣ 核心概念

Spring MVC 的拦截器(HandlerInterceptor)可以用两种方式注册:

  1. 由 Spring 管理的 Bean 注入

    • 通过 @Component@Bean 注入

    • 拦截器内部可以使用 @Autowired 注入其他 Bean

  2. 直接 new 一个对象

    • 拦截器内部不依赖 Spring Bean,完全自给自足

    • 不会触发 Spring 的依赖注入和生命周期管理

  3. 什么时候用哪个?

         3.1.拦截器需要依赖注入的情况

                如果拦截器中需要通过 @Autowired 注入属性,例如:

@Component
public class TokenIntercept implements HandlerInterceptor {@Autowiredprivate RedisTemplate redisTemplate;
}
  • 则拦截器类必须加上 @Component,由 Spring 容器管理。

  • WebMvcConfigurer 中必须通过 @Autowired 注入该拦截器:

@Autowired
private TokenIntercept tokenIntercept;
  • 如果使用 new TokenIntercept() 直接创建实例,拦截器内部的 redisTemplate 将会是 null,依赖注入无法生效。

         3.2.拦截器不依赖注入的情况

                如果拦截器内部不需要通过 @Autowired 注入属性,则类上加不加 @Component 都可以。

  • WebMvcConfigurer 中可以通过 @Autowired 注入,也可以直接 new 实例:

registry.addInterceptor(new LoginInterceptor());
  • 因为拦截器内部没有依赖注入的属性,所以无论 Spring 管理与否,都不会影响拦截器的功能。


2️⃣ 为什么要注意这个区别?

情况方法原因
拦截器内部需要注入其他 Bean(Redis、JWT、Service 等)通过 Spring 注入 (@Component + @Autowired)直接 new 拦截器不会触发依赖注入,内部对象为 null
拦截器内部不需要依赖 Bean可以直接 new简单轻量,不依赖 Spring 管理

💡 关键点:是否依赖 Spring 注入决定能否直接 new。


3️⃣ 例子对比

3.1 通过 Spring 注入

@Component
public class TokenIntercept implements HandlerInterceptor {@Autowiredprivate RedisUtil redisUtil;@Autowiredprivate JwtUtil jwtUtil;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("拦截器拦截请求");String token = request.getHeader("token");if (token == null) return false;String userId = jwtUtil.parseJWT(token);String redisToken = (String) redisUtil.get("token:userId:" + userId);return token.equals(redisToken);}
}@Configuration
public class TokenInterceptConfig implements WebMvcConfigurer {@Autowiredprivate TokenIntercept tokenIntercept; // 注入 Spring 管理的 Bean@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(tokenIntercept).excludePathPatterns("/login/**","/register/**").addPathPatterns("/**");}
}

✅ 特点:

  • TokenIntercept 内部依赖 RedisUtilJwtUtil

  • 必须通过 @Autowired 注入,不能 new


3.2 直接 new 对象

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("登录拦截器拦截请求");return true;}
}@Configuration
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()) // 直接 new.excludePathPatterns("/login/**", "/register/**");}
}

✅ 特点:

  • 拦截器内部没有依赖 Spring Bean

  • 直接 new 就可以使用

  • 生命周期由程序管理,Spring 不会干预


4️⃣ 总结

  1. 是否依赖注入 决定拦截器是否可以直接 new:

    • 依赖注入 → 必须通过 Spring 容器管理

    • 不依赖 → 可直接 new

  2. 注意事项

    • 如果直接 new,会导致拦截器内部的 @Autowired 失效

    • Spring 管理的 Bean 可以享受 AOP、事务、依赖注入等功能

  3. 最佳实践

    • 推荐:所有需要依赖注入的拦截器都使用 Spring 容器管理

    • 简单拦截器(如日志、统计、权限判断)可以直接 new

http://www.lryc.cn/news/625143.html

相关文章:

  • gdb的load命令和传给opeocd的monitor flash write_image erase命令的区别
  • 优秀开发者的重要认知能力无法被AI替代
  • 在win10/11下Node.js安装配置教程
  • Ai Agent 项目
  • 项目延期的主要原因分析,以及应对策略
  • 摔倒检测数据集:1w+图像,yolo标注
  • 深度学习-计算机视觉-微调 Fine-tune
  • 【完整源码+数据集+部署教程】织物缺陷检测系统源码和数据集:改进yolo11-RevCol
  • STL库——string(类函数学习)
  • steal tsoding‘s pastebeam code as go server
  • CMake指令:查找文件(find_file)、查找目录(find_path)、查找库文件(find_library)
  • npm设置了镜像 pnpm还需要设置镜像吗
  • Esp32基础(③旋转编码器)
  • wait / notify、单例模式
  • 在openEuler系统中如何查看文件夹下每个文件的大小
  • AVB(Android Verified Boot)中vbmeta结构浅析
  • C/C++ 中 str、str、*str 在指针语境下的具体含义(以 char* str 为例):
  • Android输入框文字不垂直居中
  • Linux下的软件编程——IPC机制
  • Java发送企业微信通知
  • Vue2篇——第五章 Vue.js 自定义指令与插槽核心
  • (第十八期)图像标签的三个常用属性:width、height、border
  • minio安装和配置
  • 【DL学习笔记】交叉熵损失函数详解
  • 之前说的要写的TCP高性能服务器,今天来了
  • 给linux的root磁盘扩容
  • Ansible 部署LNMP
  • 每日AI要闻【20250818】
  • 自回归图像生成新突破!140亿参数自回归模型NextStep-1开源,图像生成无需扩散模型
  • 基于SFM的三维重建MATLAB程序