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

网友投稿 684 2022-12-15

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

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 stFoeFUEJtatic 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拦截内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持http://我们!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决mybatis resultMap根据type找不到对应的包问题
下一篇:详解Spring AOP自定义可重复注解没有生效问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~