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攔截內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解Spring AOP自定義可重復註解沒有生效問題
- 使用spring通過aop獲取方法參數和參數值
- Spring使用AspectJ的註解式實現AOP面向切面編程
- Java基礎元註解基本原理示例詳解
- Spring AOP中三種增強方式的示例詳解