spring 重复注解和aop拦截的实现示例

 更新时间:2021年08月25日 15:27:53   作者:花开浪漫拾  
本文主要介绍了spring 重复注解和aop拦截的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言:

  1:jdk1.8开始支持重复注解@Repeatable实现

  2:aop拦截需要拦截当前注解和@Repeatable指向的包装注解才可以完全拦截到,因为:1.当在在方法上只有一个注解时,aop拦截认为是非包装类型注解。2.当方法上有多个重复注解时,aop拦截认为是包装类型注解。 

重复注解实现方式(RequestLimit为原始注解,RequestLimitPack为包装注解):

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 接口限流
 *
 * @author wulm
 */
@Repeatable(RequestLimit.RequestLimitPack.class)
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestLimit {

    /**
     * 最大次数,比如 每分钟100次、每小时500次、每天1000次
     */
    int maxTimes();

    /**
     * 频率更新时间,比如 60:每分钟、  3600:每小时、  86400:每天
     **/
    int seconds();

    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @interface RequestLimitPack {
        RequestLimit[] value();
    }
}

重复注解效果:

 

aop拦截(设置了两处@Around):

@Aspect
@Configuration
public class RequestLimitAop {
    private static final Logger LOGGER = LoggerFactory.getLogger(RequestLimitAop.class);

    public static final String REDIS_SPLIT_STR = "#";
    public static final String SUB_MODULE = "API";

    @Pointcut(value = "@annotation(com.zxy.product.hr.sync.web.config.annotation.RequestLimit)")
    public void pointcut() {
    }

    @Pointcut(value = "@annotation(com.zxy.product.hr.sync.web.config.annotation.RequestLimit" +
            ".RequestLimitPack)")
    public void pointcutRequestLimitOuts() {
    }


    @Around(value = "pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取拦截的方法名
        MethodSignature msig = (MethodSignature) joinPoint.getSignature();
        // 获取到注解
        RequestLimit requestLimit = msig.getMethod().getAnnotation(RequestLimit.class);

        ResultInfo resultInfo = checkFrequency(requestLimit, false);
        if (ResultInfo.isSuccess(resultInfo)) {
            // 继续执行方法
            return joinPoint.proceed();
        } else {
            return resultInfo;
        }
    }

    @Around(value = "pointcutRequestLimitOuts()")
    public Object aroundRequestLimitOuts(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取拦截的方法名
        MethodSignature msig = (MethodSignature) joinPoint.getSignature();
        // 获取到注解
        RequestLimit.RequestLimitPack requestLimitPack = msig.getMethod()
                .getAnnotation(RequestLimit.RequestLimitPack.class);
        for (RequestLimit requestLimit : requestLimitPack.value()) {
            ResultInfo resultInfo = checkFrequency(requestLimit, false);
            if (!ResultInfo.isSuccess(resultInfo)) {
                //失败立即返回
                return resultInfo;
            }
        }
        //没问题则继续执行
        return joinPoint.proceed();
    }


    public static ResultInfo checkFrequency(RequestLimit requestLimit, boolean isInnerApi) {
     //代码忽略......
    }

}



到此这篇关于spring 重复注解和aop拦截的实现示例的文章就介绍到这了,更多相关spring 重复注解和aop拦截内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 五种JAVA GUI布局管理的方式

    五种JAVA GUI布局管理的方式

    这篇文章主要介绍了JAVA几种GUI布局管理的相关知识,文中代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 配置了jdk的环境idea却提示找不到jdk解决办法

    配置了jdk的环境idea却提示找不到jdk解决办法

    在使用Java编程语言进行开发时,IDEA是一个非常流行和强大的集成开发环境,这篇文章主要给大家介绍了关于配置了jdk的环境idea却提示找不到jdk的解决办法,需要的朋友可以参考下
    2023-12-12
  • Spring中@Value注解详细图文讲解

    Spring中@Value注解详细图文讲解

    在spring中有两种注入方式一种是XML文件注入,另一种则是注解注入,这篇文章主要给大家介绍了关于Spring中@Value注解的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • java修改JFrame默认字体方式

    java修改JFrame默认字体方式

    这篇文章主要介绍了java修改JFrame默认字体方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Jedis操作Redis数据库的方法

    Jedis操作Redis数据库的方法

    这篇文章主要为大家详细介绍了Jedis操作Redis数据库的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Elasticsearch(ES)多种查询方式案例

    Elasticsearch(ES)多种查询方式案例

    Elasticsearch是一个分布式的RESTful搜索和分析引擎,可让您轻松地大规模存储,搜索和分析,这篇文章主要给大家介绍了关于Elasticsearch(ES)多种查询方式的相关资料,需要的朋友可以参考下
    2023-09-09
  • String与Blob互转和file文件与Blob互转方式

    String与Blob互转和file文件与Blob互转方式

    这篇文章主要介绍了String与Blob互转和file文件与Blob互转方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 浅谈JAVA工作流的优雅实现方式

    浅谈JAVA工作流的优雅实现方式

    这篇文章主要介绍了浅谈JAVA工作流的优雅实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 关于slf4j_log4j2源码学习心得

    关于slf4j_log4j2源码学习心得

    这篇文章主要介绍了slf4j_log4j2源码学习心得,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring @ExceptionHandler注解统一异常处理和获取方法名

    Spring @ExceptionHandler注解统一异常处理和获取方法名

    这篇文章主要介绍了Spring注解之@ExceptionHandler 统一异常处理和获取方法名,在实际项目中,合理使用@ExceptionHandler能够提高代码的可维护性和用户体验,通过本文的解析和实践,读者可以更好地理解和掌握@ExceptionHandler的用法和原理
    2023-09-09

最新评论