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

来源:互联网 发布:caffe ubuntu 编辑:程序博客网 时间:2024/06/07 00:09

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@EnableWebMvcpublic 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()));        }    }}

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

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

原创粉丝点击