学习更多Java干货,戳上面的
蓝色字题
关注我!
最近自己写了一个关于网关限流的插件,为了实现限流时的灵活性所以选择了使用自定义注解,但是在百度了很多篇文章时发现大部分的答案是使用反射,一部分是使用注解处理器。个人感觉这样实现都不是很合适,感兴趣的兄弟可以看一下我是如何使用的。
1. 如何自定义注解
这个其实网络上的文章太多太多了,我这里就简单的说一下
@Target(ElementType.TYPE)//ElementType.TYPE表示可以用在类上,ElementType.METHOD表示可以用在方法上
@Retention(RetentionPolicy.RUNTIME)//RetentionPolicy.RUNTIME运行事保留RetentionPolicy.CLASS编译时保留
@Documented//会被 javadoc 之类的工具处理
@Inherited//表示可以被继承
public @interface ClassRateLimit {
}
2. 通过切面的方式处理注解
我们定义这样的一个切面来对注解标注的方法或者类来进行处理
@Aspect
@Component
public class ClassAnnotationAspect {
@Pointcut("@within(classRateLimit)")
public void annotationPointcut(ClassRateLimit classRateLimit) {
}
@Before("@within(classRateLimit)")
public void doBefore(JoinPoint joinPoint, ClassRateLimit classRateLimit) {
//classRateLimit 通过这个对象获取注解中的属性
MethodSignature signature = (MethodSignature) joinPoint.getSignature();//通过这个对象取得本次请求的方法信息
Class[] clazz=joinPoint.getClass();//通过这个对象取得本次请求的类信息
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) //通过这个对象取得本次请求的request和response信息
RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
HttpServletResponse response = requestAttributes.getResponse();
}
}
3. 如何应用于实践呢
在1和2的两个步骤中,我们自定义了一个注解,也给他写了一个处理方法,如果是我们应用于自己的项目其实已经是没问题的,只要让ClassAnnotationAspect类被Spring管理就行了。
@Configuration
@ComponentScan(basePackages="cn.org.zhixiang")
public class EnableSyjRateLimitConfiguration {
}
当别人要使用我提供的服务时只需要这样引入即可
@Import(EnableSyjRateLimitConfiguration.class)
@Configuration
public class SyjRateLimitConfig {
}
点击下方“阅读原文”查看源码!!!
推荐阅读

点赞收藏转发好看再走呗!
本文介绍了一种不依赖反射或注解处理器的自定义注解方法,通过AOP(面向切面编程)实现网关限流的灵活性。作者详细解释了如何自定义注解,以及如何通过切面处理这些注解,为方法或类提供限流功能。此外,还提供了将此功能应用于实际项目中的示例。
1081

被折叠的 条评论
为什么被折叠?



