这篇文章给大家分享的是有关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拦截”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。