之前也写过拦截器相关的内容,无非就是需要实现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就不会管理这个对象了,那么里面的注入的对象肯定也必须你自己去创建才行啦