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

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

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

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

时间: 2024-11-01 13:45:57

Spring Boot 自动加载指定包下的拦截器的相关文章

Spring Boot实现一个监听用户请求的拦截器

  项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 项目构建与Spring Boot,Spring Boot实现一个拦截器很容易. Spring Boot的核心启动类继承WebMvcConfigurerAdapter // 增加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestLog()); } /

Spring Boot 启动加载数据 CommandLineRunner

实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实现. 很简单,只需要一个类就可以,无需其他配置. 创建实现接口 CommandLineRunner 的类 package org.springboot.sample.runner; import org.springframework.boot.CommandLineRunner; import

在Intellij IDEA 中自动加载Maven管理的依赖包的源码

如果你的项目不是用 Maven 管理的,可以在项目依赖的Libraries下手工添加依赖包对应的源码jar文件路径, 方法可以参考此文: https://yq.aliyun.com/articles/72560 但如果你是用 Maven 来管理项目,就不用怎么麻烦了,只需要在 Intellij IDEA 中设置一下即可. 设置方法如下: 一.打开 File -> Settings 窗口,然后在左边选择 Build, Execution, Deployment -> Build Tools -&

Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多

很想给大家分享这个开源项目,但是由于工作的关系,没有抽出空,但还是趁着工作间隙写下了这篇博客. 简介 LRecyclerView是支持addHeaderView. addFooterView.下拉刷新.分页加载数据的RecyclerView. 它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView.FooterView,并且不需要对你的Adapter做任何修改. 主要功能 下拉刷新.滑动到底部自动加载下页数据: 可以方便添加Header和Footer:

Android 下拉刷新框架实现、仿新浪微博、QQ好友动态滑到底部自动加载

苦苦找寻的2个版本,经过测试好用.再次感谢原作者! 1.第一个版本 Android 下拉刷新框架实现 http://blog.csdn.net/leehong2005/article/details/12567757 前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但这些demo的质量参差不齐,用户体验也不好,接口设计也不行.最张没办法,终于忍不了了,自己就写了一个下拉刷新的框架,这个框架是一个通用的框架,效果和设计感觉都还不错,现在分享给各位看官. 1. 关于下拉刷新 下拉

spring mvc-关于maven加载jar包的机制

问题描述 关于maven加载jar包的机制 maven添加一个jar包后,这个jar包依赖的其他包有些会自动下载,有些不会是为什么 例如: springmvc的缓存依赖ehcache,ui有freemarker,我pom并没有配置这两个jar包,我代码使用了ehcache,没用freemarker,但是ehcache的会自动下载,freemarker则不会 maven是什么加载机制导致ehcache会自动下载,而freemarker则不会,求解释 解决方案 需要在Maven的Pom.xml文件中

应用列表-Android如何根据包名加载指定应用

问题描述 Android如何根据包名加载指定应用 楼主想实现一个加载指定应用到gridview上,从网上参考了别人的代码然后改来改去都没能成功,楼主是初学者,java和android都比较薄弱,求各大侠能指点一下loadapps那一段代码要怎么写( ⊙o⊙ ) public class Appinfo extends Activity { private List mApps; GridView mGrid; @Override protected void onCreate(Bundle sa

infinitescroll瀑布流在运行之后 向下滚动没有出现自动加载,那位牛人给看看啊

问题描述 infinitescroll瀑布流在运行之后 向下滚动没有出现自动加载,那位牛人给看看啊 <br> var pageindex = 1;<br> var pagesize = 30;</p> <pre><code> function item_masonry() { $('.item img').load(function () { $('.infinite_scroll').masonry({ itemSelector: '.maso

做了一个listview的下拉刷新和底部自动加载,但我做完之后项目能运行,但就是始终加载不出来,求教

问题描述 做了一个listview的下拉刷新和底部自动加载,但我做完之后项目能运行,但就是始终加载不出来,求教 底下是代码 package caifu.life.ZHSQ.main; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os