欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot开发案例之拦截器注入Bean

程序员文章站 2022-04-28 12:19:15
前言 由于业务需要,需要在拦截器中操作Redis缓存,按照 controller,service层配置发现无法注入,一直报空指针异常。 解决方案 拦截器: 查询原因 拦截器执行在Bean初始化之前导致这个问题的。在web.xml中各个元素的执行顺序是这样的,context param listene ......

SpringBoot开发案例之拦截器注入Bean

前言

由于业务需要,需要在拦截器中操作redis缓存,按照 controller,service层配置发现无法注入,一直报空指针异常。

解决方案

@configuration
public class mywebappconfigurer extends webmvcconfigureradapter {
 
    /**
      * 将自定义拦截器作为bean写入配置
      * @return
      */
     @bean
     public sysinterceptor sysinterceptor() {
      return new sysinterceptor();
     }
     /**
      * 对拦截器注册
      */
    @override
    public void addinterceptors(interceptorregistry registry) {
        string[] patterns = new string[] {"/swagger-resources/**"};
        registry.addinterceptor(sysinterceptor())
                                 .addpathpatterns("/**")
                                 .excludepathpatterns(patterns);
        super.addinterceptors(registry);
    }
}

拦截器:

public class sysinterceptor  implements handlerinterceptor {
    
    private static final logger logger = loggerfactory.getlogger(sysinterceptor.class);
    
    @autowired
    private redistemplate<string, string> redistemplate;

    
    @override
    public boolean prehandle(httpservletrequest request, httpservletresponse response,
            object handler) throws exception {
            //业务逻辑
         return true;
    }

    @override
    public void posthandle(httpservletrequest request, httpservletresponse response, object handler,
            modelandview modelandview) throws exception {
        
    }

    @override
    public void aftercompletion(httpservletrequest request, httpservletresponse response,
            object handler, exception ex) throws exception {
        
    }
}

查询原因

拦截器执行在bean初始化之前导致这个问题的。在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->filter-->servlet; 而拦截器是在spring mvc中配置的,如果从整个项目中看,一个servlet请求的执行过程就变成了这样context-param-->listener-->filter-->servlet-->interceptor,为什么拦截器是在servlet执行之后,因为拦截器本身就是在servlet内部的。

概念

  • servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。

  • filter:filter是一个可以复用的代码片段,可以用来转换http请求、响应和头信息。filter不像servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

  • listener:监听器,从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据 其要求作出相应的响应。通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执 行代码的功能组件。

  • interceptor:拦截器是对过滤器更加细化的应用,他不仅可以应用在service方法前后还可以应用到其他方法的前后拦截器。