由于营业须要,须要在拦截器中操纵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要领前后还能够运用到其他要领的前后拦截器。
以上就是SpringBoot之拦截器注入Bean的要领引见(代码示例)的细致内容,更多请关注ki4网别的相干文章!