Spring Boot 自动加载指定包下的拦截器

    xiaoxiao2022-07-07  188

    Spring Boot 在我们需要对程序添加拦截器需要使用 WebMvcConfigurerAdapter 中的 addInterceptors方法去注册拦截器,这样我们如果在程序里面有多个拦截或者我们在项目结构为maven 关系存在父子级关系时候。WebMvcConfigurerAdapter 类我们写在父类 这样就无法获取到子类存在哪些拦截器了。这个我们就需要在父级和子级都写对应的 WebMvcConfigurerAdapter 方法。这里我根据前面我的一篇博客为 获取某个包下面的所有类来实现自动加载某个包下面的所有拦截器。

    前一篇博客地址:http://blog.csdn.net/jiangzeyin_/article/details/74702463

    第一个类注解(主要配置对应拦截器拦截的路径):

    package com.yoke.common.interceptor; import java.lang.annotation.*; /** * Created by jiangzeyin on 2017/2/4. */ @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface InterceptorPattens { String[] value() default {"/**"}; }

    然后拦截器加载控制类:

    package com.yoke.common.interceptor; /** * Created by jiangzeyin on 2017/2/4. */ import com.yoke.system.log.SystemLog; import com.yoke.util.PackageUtil; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import java.io.IOException; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.List; /** * 拦截器控制器 * * @author jiangzeyin * @create 2017 02 04 16:12 */ @Configuration @EnableWebMvc public class InterceptorControl extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { init(registry); } /** * @param registry */ private void init(InterceptorRegistry registry) { List<String> list; try { list = PackageUtil.getClassName("com.yoke.common.interceptor"); } catch (IOException e) { SystemLog.ERROR().error("加载拦截器错误,初始化包错误", e); return; } if (list == null || list.size() <= 0) { SystemLog.LOG().info("加载拦截器错误,没有需要初始化的拦截器"); return; } for (String item : list) { Class<HandlerInterceptorAdapter> classItem = null; try { classItem = (Class<HandlerInterceptorAdapter>) Class.forName(item); } catch (ClassNotFoundException e) { SystemLog.ERROR().error("加载拦截器错误", e); } if (classItem == null) continue; boolean isAbstract = Modifier.isAbstract(classItem.getModifiers()); if (isAbstract) continue; if (!HandlerInterceptorAdapter.class.isAssignableFrom(classItem)) continue; InterceptorPattens interceptorPattens = classItem.getAnnotation(InterceptorPattens.class); if (interceptorPattens == null) continue; HandlerInterceptorAdapter handlerInterceptor = null; try { handlerInterceptor = classItem.newInstance(); } catch (InstantiationException | IllegalAccessException e) { SystemLog.ERROR().error("加载拦截器错误", e); continue; } if (handlerInterceptor == null) continue; registry.addInterceptor(handlerInterceptor).addPathPatterns(interceptorPattens.value()); SystemLog.LOG().info("加载拦截器:" + classItem + " " + Arrays.toString(interceptorPattens.value())); } } }

    这就可以自动加载包下面属于对应拦截器的类了。

    我就可以放心的写拦截器了,再也不用手动去注册了。

    相关资源:详解Spring Boot 配置加载顺序及属性加载顺序
    最新回复(0)