拦截器自动注入@Autowired对象为null解决方法

本文解决了一个在Spring MVC中使用拦截器时@Autowired注解无法正确注入依赖的问题。作者通过调整拦截器实例的创建方式,从直接new改为使用@Bean注解,成功实现了依赖注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   之前也写过拦截器相关的内容,无非就是需要实现HandlerInterceptor接口,然后重写preHandle这个方法,因为之前不需要调用额外的对象,都是只使用到preHandle参数里的request对象的内容,但这次我需要用到一个redis的工具类,所以很自然的加上了以下代码:


public class AdminInterceptor implements HandlerInterceptor {

    @Autowired
    RedisUtils redisUtils;  //这个对象新加入的一个对象


    /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("执行了AdminInterceptor 的preHandle方法");
        try {
            System.out.println(redisUtils);
            ......业务逻辑处理

然后发现redisUtils对象一直为null,我就在类上加入@Component,发现也不好使,后面网上各种查询发现,一个原因是因为拦截器加载是在springcontext创建之前完成的,所以在拦截器中注入实体自然就为null

另外还有一个原因就是因为如果是new出来的对象,spring是不会来管理该对象的,所以这个对象里面的@Autowired也肯定是为null的。

然后我就发现 其实我这个拦截器类是手动new出来的,在下面这个类里

@Configuration
public class LoginConfig implements WebMvcConfigurer {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册AdminInterceptor拦截器
        InterceptorRegistration registration = registry.addInterceptor(new AdminInterceptor());
        //所有路径都不被拦截
        registration.addPathPatterns("/*");
        ......

注册AdminInterceptor的时候 我是使用的new对象的方式做的,所以这个对象spring不会进行管理,那么里面@Autowired的内容肯定也是为空的,所以我立马对这个地方进行修改,代码如下:

@Configuration
public class LoginConfig implements WebMvcConfigurer {

    @Bean
    AdminInterceptor getAdminInterceptor(){
        return new AdminInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册AdminInterceptor拦截器
        InterceptorRegistration registration = registry.addInterceptor(getAdminInterceptor());
        //所有路径都不被拦截
        registration.addPathPatterns("/*");
        ......

现在通过@Bean的方式来创建这个拦截器对象,把创建对象的主动权交给了spring,然后拦截器那边就可以正常注入了,其实不单单在这里会出现这个情况,只要是你自己new出来的对象,然后这个对象里面的内容你去@Autowired都会为null,因为你自己new对象了 spring就不会管理这个对象了,那么里面的注入的对象肯定也必须你自己去创建才行啦

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值