当前位置: 首页 > 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.dtcms.com/a/337175.html

相关文章:

  • OSCP - Proving Grounds - Vanity
  • 分布式系统的“不可能三角”:CAP定理深度解析
  • 【数据结构】堆中插入数据,删除数据
  • Android Handler 线程执行机制
  • python遇到异常流程
  • 【Langchain系列二】LangChain+Prompt +LLM智能问答入门
  • Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1)进程间通信(IPC)的比较
  • Baumer高防护相机如何通过YoloV8深度学习模型实现网球运动员和网球速度的检测分析(C#代码UI界面版)
  • Spring AI Alibaba 项目接入兼容 OpenAI API 的大模型
  • Midjourney绘画创作入门操作创作(在线教育背景系列)
  • IOPaint 远程修图:cpolar 内网穿透服务实现跨设备图片编辑
  • Ansible文件部署与大项目多主机管理
  • 【Git】windows系统删除同名路径
  • 机器翻译论文阅读方法:顶会(ACL、EMNLP)论文解析技巧
  • IntelliJ IDEA中Maven的“Sync“与“Reload“详解:小白的避坑指南
  • python DataFrame基础操作
  • 从零开始部署经典开源项目管理系统最新版redmine6-Linux Debian12
  • 链路聚合路由器OpenMPTCProuter源码编译与运行
  • 如何在 Ubuntu 24.04 安装 Python 3.12 ?
  • SpringAI集成MCP
  • 详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
  • 【金融数据分析】用Python对金融产品价格进行时间序列分解
  • MySQL的锁:
  • Python入门第9课:面向对象编程(OOP)从零开始,类、对象与三大特性
  • Leetcode 3650. Minimum Cost Path with Edge Reversals
  • Vue Router的常用API有哪些?
  • 05 定时器,延时器、递归、内置对象(Object 对象+Math 对象+Date 对象+String对象)
  • Less (CSS 预处理器)
  • 8.18网络编程——基于UDP的TFTP文件传输客户端
  • 后端通用基础代码