spring 重复注解和aop拦截的实现示例
程序员文章站
2022-03-12 23:21:24
前言: 1:jdk1.8开始支持重复注解@repeatable实现 2:aop拦截需要拦截当前注解和@repeatable指向的包装注解才可以完全拦截到,因为:1.当在在方法上只有一个注解时,ao...
前言:
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拦截内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
推荐阅读
-
一起学Spring之注解和Schema方式实现AOP
-
@Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题
-
spring中过滤器(filter)、拦截器(interceptor)和切面(aop)的执行顺序
-
Spring AOP 代理实现的两种方式: JDK动态代理 和 Cglib框架动态代理
-
AOP之基于XML的声明式AspectJ和注解式AspectJ的实现
-
SpringMVC(10):实现MVC的两个示例和注解改进
-
spring 重复注解和aop拦截的实现示例
-
深入分析 Spring 基于注解的 AOP 实现原理
-
Java框架之spring(二)静态和动态代理、AOP及AOP的实现方式
-
spring boot使用自定义注解+AOP实现对Controller层方法的日志记录