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.util.zip.ZipFile解压后被java占用问题
这篇文章主要介绍了如何解决java.util.zip.ZipFile解压后被java占用问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-06-06
SpringBoot+Mybatis实现Mapper接口与Sql绑定几种姿势
通常我们在使用Mybatis进行开发时,会选择xml文件来写对应的sql,然后将Mapper接口与sql的xml文件建立绑定关系,然后在项目中调用mapper接口就可以执行对应的sql,感兴趣的可以学习一下2021-09-09
Spring调度框架EnableScheduling&Scheduled源码解析
这篇文章主要介绍了Spring调度框架EnableScheduling&Scheduled源码解析,@EnableScheduling&Scheduled定时调度框架,本着不仅知其然还要知其所以然的指导思想,下面对该调度框架进行源码解析,以便更好的理解其执行过程,需要的朋友可以参考下2024-01-01
使用sharding-jdbc实现水平分库+水平分表的示例代码
本文主要介绍了使用sharding-jdbc实现水平分库+水平分表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2021-12-12
Java的Hibernate框架中一对多的单向和双向关联映射
建立对SQL语句的映射是Hibernate框架操作数据库的主要手段,这里我们列举实例来为大家讲解Java的Hibernate框架中一对多的单向和双向关联映射2016-06-06
Spring Cloud Gateway(读取、修改 Request Body)的操作
这篇文章主要介绍了Spring Cloud Gateway(读取、修改 Request Body)的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-12-12
Java中的HashSet详解和使用示例_动力节点Java学院整理
HashSet 是一个没有重复元素的集合。接下来通过实例代码给大家介绍java中的hashset相关知识,感兴趣的朋友一起看看吧2017-05-05


最新评论