首页 > 编程语言 >自定义java@注解

自定义java@注解

时间:2023-07-16 17:35:49浏览次数:31  
标签:java 自定义 retryTimes lockKey expireTime static 注解 public

自定义注解主要用于抽象出重复代码,以减少枯燥无味的重复工作量
举例:创建Redis分布式锁注解
步骤:

  1. 新建interface接口
@Target(ElementType.METHOD)
//描述注解使用范围
@Retention(RetentionPolicy.RUNTIME)//设置注解时间范围
//        SOURCE  源文件保留
//        CLASS,  编译期保留,默认值
//        RUNTIME 运行期保留,可通过反射去获取注解信息
@Documented //使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息
@Inherited  //被Inherited注解修饰的注解具有继承性,如果父类使用了被@Inherited修饰的注解,则其子类将自动继承该注解。
public @interface RedisLock {
    String lockKey();
    long expireTime() default 5;
    TimeUnit timeUnit() default TimeUnit.MINUTES;
    int retryTimes() default 10;
}
  1. 再创建AOP工具类
@Aspect
public class RedislockAspect {
    @Around(value = "@annotation(com.haipali.annotation.RedisLock)")
    public void handleRedisLock(ProceedingJoinPoint joinPoint){
//        通过反射获取注解对象
        RedisLock redisLock = ((MethodSignature)joinPoint.getSignature())
                .getMethod()
                .getAnnotation(RedisLock.class);
//        获取对象变量
        String lockKey = redisLock.lockKey();
        LOCK_KEY = lockKey;
        long expireTime = redisLock.expireTime();
        TimeUnit timeUnit = redisLock.timeUnit();
        int retryTimes = redisLock.retryTimes();
//        获取锁
        if(tryLock(lockKey,expireTime,timeUnit,retryTimes)){
            try {
                joinPoint.proceed();
            } catch (Throwable e) {
                e.printStackTrace();
            }finally {
                releaseLock();
            }
        }
    }
}
  1. 以下为RedisTool
public class RedisTool {
    static Jedis jedis = new Jedis("localhost");
    static String LOCK_KEY = null;
    public static boolean tryLock(String lockKey, long expireTime, TimeUnit timeUnit, int retryTimes) {
        final long RETRY_WAIT_TIME = 100; // 获取锁失败后的重试等待时间,单位毫秒
        // 获取分布式锁
        while (retryTimes > 0) {
            // 使用 SETNX 命令尝试获取锁
            Long result = jedis.setnx(lockKey, "locked");
            if (result == 1) {
                // 成功获取到锁,设置过期时间
                jedis.expire(lockKey, expireTime);
                return true;
            } else {
                // 获取锁失败,重试等待一段时间
                retryTimes--;
                try {
                    Thread.sleep(RETRY_WAIT_TIME);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }
        return false;
    }
    public static void releaseLock() {
        jedis.del(LOCK_KEY);
    }
}
  1. 然后就能肆意妄为的使用啦
public class update {
    @RedisLock(lockKey = "lock",expireTime = 5,timeUnit = TimeUnit.SECONDS,retryTimes = 10)
    public static void update() {
        System.out.println("java");
    }
    public static void main(String[] args) {
        update();
    }
}

标签:java,自定义,retryTimes,lockKey,expireTime,static,注解,public
From: https://www.cnblogs.com/haipali/p/17558170.html

相关文章

  • Java-集合-八股文
    list、setlist:有序,可重复,允许多个null,支持下标随机访问set:无序,不可重复,单一null,必须遍历访问arraylist、linkedlistarraylist:基于数组实现,占用连续空间,有利于查找、修改,不利于插入、删除[适用场景不同]linkedlist:基于链表实现,不要求占用空间连续,有利于插入、删除,不利于......
  • Java处理子父级菜单的方式二
    处理存在子父级关系的数据是写代码的过程中常见的操作,前面讲解过使用递归的方法来做,可以参考这篇博客https://www.cnblogs.com/yilangcode/p/16831867.html今天来聊聊一种新的处理方式。使用List集合多轮遍历,添加子父级菜单信息。建表SQLDROPTABLEIFEXISTS`sa_menu`......
  • java序列化和反序列化
    感觉网上很多博客对这个的解释实在太官方了,也没说为什么一定要实现序列化接口。去看看rpc框架源码,或者java网络编程或者向磁盘进行序列化就知道了。首先这是个标记接口,就是用来告诉程序某某对象是可序列化对象,像dubbo框架,要传输对象就必须序列化。网络编程已经告诉你了,想要向另......
  • Java性能优化-测试try-catch放在循环内和外的性能对比与业务区别
    场景Java中使用JMH(JavaMicrobenchmarkHarness微基准测试框架)进行性能测试和优化:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751使用如上方式测试Java中try-catch放在循环内和循环外是否有性能上的差别。注:博客:https://blog.csdn.net/badao_lium......
  • 用java写一个逆置单链表
    用Java写一个逆置单链表单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的引用。逆置单链表是指将原来的单链表中的节点顺序颠倒过来。在这篇文章中,我们将使用Java来实现逆置单链表的功能。我们将会介绍单链表的基本概念,并给出逆置单......
  • 用java创建一个单链表
    使用Java可以很方便地创建和操作数据结构,其中包括单链表。单链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。这种数据结构可以用于实现队列、栈、链表等等。在本文中,我们将学习如何使用Java创建一个单链表,并演示一些基本的操作。首先,我......
  • day07 7.1 Java中的面向对象之类与对象
    day077.1Java中的面向对象之类与对象【一】类与对象【1】类定义规范类与对象的关系类是实体对象的概念模型,笼统的,不具体的,比如人类、动物类、鸟类对象又称为实体,类具体化的表现小红/小明小猫一号/小狗一号对象中有属性,有方法不同对象属性是独有的方法是共......
  • JavaScript:将对象数组映射到字典
    JavaScript:将对象数组映射到字典#javascript#打字稿#数据在JavaScript/TypeScript中将对象数组转换为字典的最简单方法:letdata=[{id:1,country:'Germany',population:83623528},{id:2,country:'Austria',population:8975552},{id:3,country......
  • Java性能优化-测试数组和链表在查询和添加删除时性能对比
    场景Java中使用JMH(JavaMicrobenchmarkHarness微基准测试框架)进行性能测试和优化:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751上面在使用JMH时测试了Java中数组和链表在进行头部插入时的对比结果。下面分别对比在头部、中部、尾部分别进行查询和......
  • SpringBoot中通过自定义Jackson注解实现接口返回数据脱敏
    场景SpringBoot中整合ShardingSphere实现数据加解密/数据脱敏/数据库密文,查询明文:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131742091上面讲的是数据库中存储密文,查询时使用明文的脱敏方式,如果是需要数据库中存储明文,而在查询时返回处理后的数据,比如身份......