zoukankan      html  css  js  c++  java
  • 我是如何把自定义注解应用到生产的

    最近自己写了一个关于网关限流的插件,为了实现限流时的灵活性所以选择了使用自定义注解,但是在百度了很多篇文章时发现大部分的答案是使用反射,一部分是使用注解处理器。个人感觉这样实现都不是很合适,感兴趣的兄弟可以看一下我是如何使用的。

    1. 如何自定义注解

    这个其实网络上的文章太多太多了,我这里就简单的说一下

    1
    2
    3
    4
    5
    6
    7
    @Target(ElementType.TYPE)//ElementType.TYPE表示可以用在类上,ElementType.METHOD表示可以用在方法上
    @Retention(RetentionPolicy.RUNTIME)//RetentionPolicy.RUNTIME运行事保留RetentionPolicy.CLASS编译时保留
    @Documented//会被 javadoc 之类的工具处理
    @Inherited//表示可以被继承
    public @interface ClassRateLimit {

    }

    2. 通过切面的方式处理注解

    我们定义这样的一个切面来对注解标注的方法或者类来进行处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    @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管理就行了。

    但是还有一种场景时,我们的这个注解作为一个jar包,提供给别人用,别人的Spring又不会管理我们jar包里的bean。这个时候怎么办呢?


    这时我们就用到了另一个注解@Import,使用这个注解可以引入一个配置类,当我们作为一个第三方jar包存在时想要别人的Spring可以管理到我们的bean的时候,我们可以提供一个统一的配置类,在这个配置类中进行扫包,注册bean等一系列操作。然后别人只需要引入我们的配置类就ok了。

    比如说,我的很多bean,包括刚才说的ClassAnnotationAspect类都在在cn.org.zhixiang包和它的子包下,那么我就可以新建一个配置类

    1
    2
    3
    4
    5
    @Configuration
    @ComponentScan(basePackages="cn.org.zhixiang")
    public class EnableSyjRateLimitConfiguration {

    }

    当别人要使用我提供的服务时只需要这样引入即可

    1
    2
    3
    4
    @Import(EnableSyjRateLimitConfiguration.class)
    @Configuration
    public class SyjRateLimitConfig {
    }

    4.看看别人是怎么实现的

    其实有些东西在文字中可能体现的不是那么完美,那么就请看一下我是在代码中如何用的吧
    https://github.com/2388386839/syj-ratelimit

    本文出自http://zhixiang.org.cn,转载请保留。

  • 相关阅读:
    B站开源播放框架ijkplayer(iOS版)使用教程
    GitHub前50名的Objective-C动画相关库
    iOS系统自带的 UIAlertView 自动旋转的实现
    iOSAPP启动时实现加载广告
    每周分享第5期(2019.5.4)
    如何为Redis中list中的项设置过期时间
    对scrapy进行单元测试 -- 使用betamax
    【AMAD】betamax -- 一个ruby-VCR的模仿品,只支持requests
    【AMAD】stackprint -- 为Python加入利于调试的traceback信息
    【AMAD】Pysnooper -- 别再用print进行debug了
  • 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/9720870.html
Copyright © 2011-2022 走看看