返回顶部
首页 > 资讯 > 精选 >java对象作为key值的实例分析
  • 877
分享到

java对象作为key值的实例分析

2023-06-22 08:06:52 877人浏览 安东尼
摘要

这篇文章给大家介绍java对象作为key值的实例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.实现方式说明下面在---- 手写redis @ Cacheable注解支持过期时间设置   的基础之上进行

这篇文章给大家介绍java对象作为key值的实例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。


    1.实现方式说明

    下面在---- 手写redis @ Cacheable注解支持过期时间设置   的基础之上进行扩展。

    1.1问题说明

    @ Cacheable(key = “'leader'+#p0 +#p1 +#p2” )一般用法,#p0表示方法的第一个参数,#p1表示第二个参数,以此类推。

    目前方法的第一个参数为Java的对象,但是原注解只支持Java的的基本数据类型。

    1.2实现步骤

    在原注解中加入新的参数,

     objectIndexArray表示哪几个角标参数(从0开始)为java对象,objectFieldArray表示对应位置该对象的字段值作为key

    如何获取参数的对象以及该字段的值

     使用的java的反射,拼接get方法获取该字段值。

    2.源代码

    修改java注解@ExtCacheable,本文中使用@NewCacheable

    package com.huajie.annotation; import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target; @Target({ ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)public @interface NewCacheable {String key() default "";int[] objectIndexArray(); String[] objectFieldArray(); int expireTime() default 1800;//30分钟}

    springaop切面NewCacheableAspect

    获取AOP整体流程没有任何变化

    主要是关键值获取的方式,发生了变化

    java对象作为key值的实例分析

    使用Java的反射技术

    java对象作为key值的实例分析

    完整代码如下:

    package com.huajie.aspect; import com.huajie.annotation.NewCacheable;import com.huajie.utils.RedisUtil;import com.huajie.utils.StringUtil;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List; @Component@Aspect@Slf4jpublic class NewCacheableAspect {     @Autowired    private RedisUtil redisUtil;     @Pointcut("@annotation(com.huajie.annotation.NewCacheable)")    public void annotationPointcut() {    }     @Around("annotationPointcut()")    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {        // 获得当前访问的class        Class<?> className = joinPoint.getTarget().getClass();        // 获得访问的方法名        String methodName = joinPoint.getSignature().getName();        // 得到方法的参数的类型        Class<?>[] arGClass = ((MethodSignature) joinPoint.getSignature()).getParameterTypes();        Object[] args = joinPoint.getArgs();        String key = "";        int expireTime = 3600;        try {            // 得到访问的方法对象            Method method = className.getMethod(methodName, argClass);            method.setAccessible(true);            // 判断是否存在@ExtCacheable注解            if (method.isAnnotationPresent(NewCacheable.class)) {                NewCacheable annotation = method.getAnnotation(NewCacheable.class);                key = getRedisKey(args, annotation);                expireTime = getExpireTime(annotation);            }        } catch (Exception e) {            throw new RuntimeException("redis缓存注解参数异常", e);        }        log.info(key);        boolean hasKey = redisUtil.hasKey(key);        if (hasKey) {            return redisUtil.get(key);        } else {            Object res = joinPoint.proceed();            redisUtil.set(key, res);            redisUtil.expire(key, expireTime);            return res;        }    }     private int getExpireTime(NewCacheable annotation) {        return annotation.expireTime();    }     private String getRedisKey(Object[] args, NewCacheable annotation) throws Exception{        String primalKey = annotation.key();        // 获取#p0...集合        List<String> keyList = geTKEyParsList(primalKey);        for (String keyName : keyList) {            int keyIndex = Integer.parseInt(keyName.toLowerCase().replace("#p", ""));            Object parValue = getParValue(annotation, keyIndex, args);            primalKey = primalKey.replace(keyName, String.valueOf(parValue));        }        return primalKey.replace("+", "").replace("'", "");    }     private Object getParValue(NewCacheable annotation, int keyIndex, Object[] args) throws Exception{        int[] objectIndexArray = annotation.objectIndexArray();        String[] objectFieldArray = annotation.objectFieldArray();        if (existsObject(keyIndex, objectIndexArray)) {            return getParValueByObject(args, keyIndex, objectFieldArray);        } else {            return args[keyIndex];        }    }     private Object getParValueByObject(Object[] args, int keyIndex, String[] objectFieldArray) throws Exception {        Class cls = args[keyIndex].getClass();        Method method;        if(objectFieldArray!=null&&objectFieldArray.length>=keyIndex){             method = cls.getMethod("get" + StringUtil.firstCharToUpperCase(objectFieldArray[keyIndex]));        }else{             method = cls.getMethod("get" + StringUtil.firstCharToUpperCase(cls.getFields()[0].getName()));        }        method.setAccessible(true);        log.info(method.getName());        return method.invoke(args[keyIndex]);    }     private boolean existsObject(int keyIndex, int[] objectIndexArray) {        if (objectIndexArray == null || objectIndexArray.length <= 0) {            return false;        }        for (int i = 0; i < objectIndexArray.length; i++) {            if (keyIndex == objectIndexArray[i]) {                return true;            }        }        return false;    }     // 获取key中#p0中的参数名称    private static List<String> getKeyParsList(String key) {        List<String> ListPar = new ArrayList<String>();        if (key.indexOf("#") >= 0) {            int plusIndex = key.substring(key.indexOf("#")).indexOf("+");            int indexNext = 0;            String parName = "";            int indexPre = key.indexOf("#");            if (plusIndex > 0) {                indexNext = key.indexOf("#") + key.substring(key.indexOf("#")).indexOf("+");                parName = key.substring(indexPre, indexNext);            } else {                parName = key.substring(indexPre);            }            ListPar.add(parName.trim());            key = key.substring(indexNext + 1);            if (key.indexOf("#") >= 0) {                ListPar.addAll(getKeyParsList(key));            }        }        return ListPar;    } }

    3.测试

    业务模块使用方法controller

    @RequestMapping("queryQuotaTreeData")@ResponseBodypublic List<Treenode> getTreeData() {QuotaManage quotaManage = new QuotaManage();quotaManage.setQuotaName("测试22222");List<TreeNode> list  = this.quotaManageService.queryQuotaTreeData(quotaManage);return list;}
     

    实现层objectIndexArray中的{0}表示第0个参数,objectFieldArray中的“quotaName”表示对应对象中的字段名称

    @Override@NewCacheable(key="test+#p0",objectIndexArray = {0},objectFieldArray = {"quotaName"})public List<TreeNode> queryQuotaTreeData(QuotaManage quotaManage) {List<TreeNode> returnNodesList = new ArrayList<TreeNode>();List<TreeNode> nodeList = this.mapper.queryQuotaTreeData();returnNodesList = treeUtils.getParentList(nodeList);log.info(nodeList.size()+"");return returnNodesList;}
     

    控制台截图拼接的get方法名称和获取的字段值

    java对象作为key值的实例分析

    Redis的截图

    java对象作为key值的实例分析

    关于java对象作为key值的实例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    --结束END--

    本文标题: java对象作为key值的实例分析

    本文链接: https://lsjlt.com/news/303384.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • java对象作为key值的实例分析
      这篇文章给大家介绍java对象作为key值的实例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.实现方式说明下面在---- 手写redis @ Cacheable注解支持过期时间设置   的基础之上进行...
      99+
      2023-06-22
    • Java对象实例分析
      这篇文章主要介绍“Java对象实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java对象实例分析”文章能帮助大家解决问题。1、寒冬的蛰伏这里的工作很繁忙,一年365天, 一天24小时几乎不停...
      99+
      2023-06-04
    • 手写redis@Cacheable注解 参数java对象作为key值详解
      目录1.实现方式说明1.1问题说明1.2实现步骤2.源代码3.测试1.实现方式说明 本文在---- 手写redis @ Cacheable注解支持过期时间设置   的基础之...
      99+
      2024-04-02
    • js遍历json对象所有key及根据动态key获取值的示例分析
      这篇文章主要介绍js遍历json对象所有key及根据动态key获取值的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实例如下:var obj = ...
      99+
      2024-04-02
    • JavaScript对象实例分析
      本篇内容介绍了“JavaScript对象实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! Java...
      99+
      2024-04-02
    • ES6对象实例分析
      本篇内容介绍了“ES6对象实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对象字面量属性的简洁表示法ES6允许对象的属性直接写变量,这...
      99+
      2023-06-27
    • Java对象结构与对象锁的示例分析
      这篇文章主要介绍Java对象结构与对象锁的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. Java对象结构Java对象结构包括三部分:对象头、对象体和填充字节,如图所示:对象头又包括三个字段:第一个字段叫...
      99+
      2023-06-29
    • Java对象复制的示例分析
      这篇文章主要介绍了Java对象复制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、图示二、MapStructpom文件 <dependency>&nb...
      99+
      2023-06-15
    • Java类和对象的示例分析
      这篇文章给大家分享的是有关Java类和对象的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是类类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实...
      99+
      2023-06-29
    • java面向对象的示例分析
      这篇文章主要介绍了java面向对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Java特效1、简单性人们希望构建一个无须深奥的专业训练就可以进行编程的系统,并...
      99+
      2023-06-29
    • JavaScript对象和数组的解构赋值实例分析
      本文小编为大家详细介绍“JavaScript对象和数组的解构赋值实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript对象和数组的解构赋值实例分析”文章能帮助大家解决疑惑,下面跟着小编...
      99+
      2024-04-02
    • java中关于对象的实例比较分析
      本篇内容主要讲解“java中关于对象的实例比较分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中关于对象的实例比较分析”吧!同类型对象的比较三个维度去比较同一性相等性相似性样例引入想象...
      99+
      2023-06-26
    • 自定义对象作为HashMap的Key问题
      目录自定义对象作为HashMap的Key首先我们自定义一个学生对象,它有姓名和年龄两个字段.HashMap使用自定义对象作为Key的注意点1. 自定义对象不重写hashCode方法和...
      99+
      2024-04-02
    • Java面向对象之多态实例分析
      这篇文章主要介绍“Java面向对象之多态实例分析”,在日常操作中,相信很多人在Java面向对象之多态实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java面向对象之多态实例分析”的疑惑有所帮助!接下来...
      99+
      2023-06-30
    • JavaScript对象引用与赋值的示例分析
      小编给大家分享一下JavaScript对象引用与赋值的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:<script type="text/jav...
      99+
      2024-04-02
    • ES6中对象数值扩展的示例分析
      这篇文章主要介绍了ES6中对象数值扩展的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。对象数值扩展Object.is判断两个值是否完...
      99+
      2024-04-02
    • Java中类与对象的示例分析
      这篇文章主要介绍Java中类与对象的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!类和对象在面向对象中,类和对象是最基本、最重要的组成单元。类实际上是表示一个客观世界某类群体的一些基本特征抽象。对象就是表示一...
      99+
      2023-06-20
    • Java中类和对象的示例分析
      这篇文章主要介绍了Java中类和对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类可以看成是创建Java对象的模板1、类的定义public class&...
      99+
      2023-06-25
    • Java中对象比较的示例分析
      这篇文章主要介绍了Java中对象比较的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。元素比较基本类型的比较在Java中,基本类型的对象可以直接比较大小public&n...
      99+
      2023-06-29
    • C++对象的构造实例分析
      这篇“C++对象的构造实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++对象的构造实例分析”文章吧。一、对象的构造...
      99+
      2023-06-30
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作